金币系统前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

508 lines
14 KiB

5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
  1. <script setup>
  2. import { reactive } from "vue";
  3. import { ref, computed, watch } from "vue";
  4. import { ElMessage } from "element-plus";
  5. import { Plus } from "@element-plus/icons-vue";
  6. import axios from "axios";
  7. import { ElMessageBox } from "element-plus";
  8. import API from "../../api/index.js";
  9. import moment from "moment";
  10. //这是获取用户信息的接口
  11. const adminData = ref({});
  12. const getAdminData = async function () {
  13. try {
  14. const result = await API.post(
  15. "http://192.168.8.93:10010/admin/userinfo",
  16. {}
  17. );
  18. adminData.value = result;
  19. addRefund.value.adminId = adminData.value.adminId;
  20. console.log("请求成功", result);
  21. console.log("用户信息", user.value);
  22. } catch (error) {
  23. console.log("请求失败", error);
  24. }
  25. };
  26. getAdminData();
  27. // 这是添加充值信息的表单
  28. const addRefund = ref({
  29. updateType: "退款",
  30. allCoin: 0,
  31. contactId: "",
  32. refundGoods: "",
  33. freeCoin: 0,
  34. rechargeCoin: 0,
  35. taskCoin: 0,
  36. });
  37. // 取消按钮
  38. const cancel = function () {
  39. addRefund.value = {};
  40. addRefund.value.updateType = "退款";
  41. addRefund.value.rechargeCoin = 0;
  42. addRefund.value.freeCoin = 0;
  43. addRefund.value.taskCoin = 0;
  44. addRefund.value.allCoin = 0;
  45. addRefund.value.adminId = adminData.value.adminId;
  46. };
  47. // 这是添加退款信息的接口
  48. const add = async function () {
  49. try {
  50. // 发送POST请求
  51. const result = await API.post(
  52. "http://192.168.8.93:10010/refund/add",
  53. addRefund.value
  54. );
  55. if (result.code === 0) {
  56. ElMessage.error(result.msg);
  57. return;
  58. }
  59. console.log("请求成功", result);
  60. ElMessage.success("添加成功");
  61. // 重置表单
  62. addRefund.value = {};
  63. addRefund.value.adminId = adminData.value.adminId;
  64. addRefund.value.updateType = "退款";
  65. addRefund.value.allCoin = 0;
  66. addRefund.value.contactId = "";
  67. addRefund.value.refundGoods = "";
  68. addRefund.value.freeCoin = 0;
  69. addRefund.value.rechargeCoin = 0;
  70. addRefund.value.taskCoin = 0;
  71. user.value = {};
  72. } catch (error) {
  73. console.log("请求失败", error);
  74. // 在这里可以处理错误逻辑,比如显示错误提示等
  75. }
  76. };
  77. const addBefore = () => {
  78. Ref.value.validate(async (valid) => {
  79. if (valid) {
  80. ElMessageBox.confirm("确认添加?")
  81. .then(() => {
  82. add();
  83. console.log("添加成功");
  84. addRefund.value.allCoin = 0;
  85. (addRefund.value.freeCoin = 0),
  86. (addRefund.value.rechargeCoin = 0),
  87. (addRefund.value.taskCoin = 0),
  88. (addRefund.value = {});
  89. })
  90. .catch(() => {
  91. console.log("取消添加");
  92. });
  93. } else {
  94. //提示
  95. ElMessage({
  96. type: "error",
  97. message: "请检查输入内容",
  98. });
  99. }
  100. });
  101. };
  102. // 表单验证
  103. // 开始时间改变时,重新验证结束时间
  104. const Ref = ref(null);
  105. const startChange = (val) => {};
  106. const rules = reactive({
  107. jwcode: [{ required: true, message: "请输入精网号", trigger: "blur" }],
  108. refundType: [{ required: true, message: "请选择退款类型", trigger: "blur" }],
  109. contactId: [{ required: true, message: "请选择退款商品", trigger: "blur" }],
  110. taskCoin: [{ required: true, message: "请输入任务金币", trigger: "blur" }],
  111. freeCoin: [{ required: true, message: "请输入免费金币", trigger: "blur" }],
  112. rechargeCoin: [
  113. { required: true, message: "请输入充值金币", trigger: "blur" },
  114. ],
  115. allCoin: [
  116. { required: true, message: "请选择付款方式", trigger: "blur" },
  117. {
  118. validator: (rule, value) => {
  119. if (value === 0) {
  120. return Promise.reject(new Error("总金币不能为0"));
  121. }
  122. return Promise.resolve();
  123. },
  124. trigger: "blur",
  125. },
  126. ],
  127. });
  128. // 查找客户信息的方法
  129. const user = ref({});
  130. const getUser = async function (jwcode) {
  131. try {
  132. // 发送POST请求
  133. const result = await API.post("http://192.168.8.93:10010/recharge/user", {
  134. jwcode: jwcode,
  135. });
  136. // 将响应结果存储到响应式数据中
  137. console.log("请求成功", result);
  138. // 存储表格数据
  139. user.value = result.data[0];
  140. user.value.A =
  141. Number(user.value.pendingRechargeTimes) +
  142. Number(user.value.pendingSpendTimes);
  143. console.log("用户信息", user.value);
  144. if (result.data.code === 0) {
  145. ElMessage.error(result.msg);
  146. } else {
  147. ElMessage.success(result.msg);
  148. }
  149. } catch (error) {
  150. console.log("请求失败", error);
  151. ElMessage.error("查询失败,请检查精网号是否正确");
  152. // 在这里可以处理错误逻辑,比如显示错误提示等
  153. }
  154. };
  155. const calculatedAllGold = computed(() => {
  156. const sum =
  157. Number(addRefund.value.freeCoin) +
  158. Number(addRefund.value.rechargeCoin) +
  159. Number(addRefund.value.taskCoin);
  160. return !isNaN(sum) ? sum : 0;
  161. });
  162. watch(calculatedAllGold, (newVal) => {
  163. addRefund.value.allCoin = newVal;
  164. });
  165. const AAA = computed(() => {
  166. return addRefund.value.jwcode;
  167. });
  168. watch(AAA, (newVal) => {});
  169. // 退款类型选项
  170. const refundType = [
  171. {
  172. value: "退款商品",
  173. label: "退款商品",
  174. },
  175. {
  176. value: "退款金币",
  177. label: "退款金币",
  178. },
  179. ];
  180. // 根据精网号查询商品
  181. const goods = ref([]);
  182. const getGoods = async function (jwcode) {
  183. try {
  184. // 发送POST请求
  185. const result = await API.post(
  186. "http://192.168.8.93:10010/consume/getDeatil/" + addRefund.value.jwcode,
  187. {}
  188. );
  189. if (result.code === 0) {
  190. addRefund.value.jwcode = "";
  191. ElMessage.error(result.msg);
  192. return;
  193. console.log("查询失败,请检查精网号是否正确");
  194. }
  195. // 将响应结果存储到响应式数据中
  196. console.log("请求成功", result);
  197. // 存储表格数据
  198. goods.value = result.data;
  199. console.log("用户信息", goods.value);
  200. } catch (error) {
  201. console.log("请求失败", error);
  202. ElMessage.error("查询失败,请检查精网号是否正确");
  203. // 在这里可以处理错误逻辑,比如显示错误提示等
  204. addRefund.value.jwcode = "";
  205. }
  206. };
  207. const calculatedRechargeGoods = computed(() => {
  208. return (
  209. +addRefund.value.freeCoin +
  210. +addRefund.value.rechargeCoin +
  211. +addRefund.value.taskCoin
  212. );
  213. });
  214. watch(calculatedRechargeGoods, (newVal) => {
  215. addRefund.value.allCoin = newVal;
  216. });
  217. watch(calculatedRechargeGoods, (newVal) => {
  218. addRefund.value.allCoin = newVal;
  219. console.log("计算的总金币", newVal);
  220. });
  221. // 绑定两个数据
  222. // 这是根据订单号查询消费信息的方法
  223. const getProductByOrderCode = async function (item) {
  224. try {
  225. // 发送POST请求
  226. const result = await API.post(
  227. "http://192.168.8.93:10010/refund/searchByOrderCode?orderCode=" + item,
  228. {}
  229. );
  230. addRefund.value.contactId = result.data.detailId;
  231. addRefund.value.refundGoods = result.data.productName;
  232. addRefund.value.orderCode = result.data.orderCode;
  233. addRefund.value.taskCoin = result.data.taskCoin * -1;
  234. addRefund.value.freeCoin = result.data.freeCoin * -1;
  235. addRefund.value.rechargeCoin = result.data.rechargeCoin * -1;
  236. addRefund.value.allCoin =
  237. result.data.taskCoin * -1 +
  238. result.data.freeCoin * -1 +
  239. result.data.rechargeCoin * -1;
  240. console.log("请求成功", addRefund.value);
  241. if (result.data.code === 0) {
  242. ElMessage.error(result.data.msg);
  243. } else {
  244. ElMessage.success("选择成功");
  245. }
  246. } catch (error) {
  247. console.log("请求失败", error);
  248. ElMessage.error("查询失败,请检查精网号是否正确");
  249. // 在这里可以处理错误逻辑,比如显示错误提示等
  250. }
  251. };
  252. const handleSelectionChange = (value) => {
  253. getProductByOrderCode(value);
  254. console.log("选择的订单号", value);
  255. const selectedItem = goods.value.find((item) => item.detailId === value);
  256. };
  257. </script>
  258. <template>
  259. <div style="font-weight: bold">新增退款</div>
  260. <el-form
  261. :model="addRefund"
  262. ref="Ref"
  263. :rules="rules"
  264. label-width="auto"
  265. style="max-width: 750px"
  266. class="form-style"
  267. >
  268. <el-form-item prop="jwcode" label="精网号">
  269. <el-input
  270. v-model="addRefund.jwcode"
  271. style="width: 220px"
  272. @change="getGoods(addRefund.jwcode)"
  273. />
  274. <el-button
  275. type="primary"
  276. @click="getUser(addRefund.jwcode)"
  277. style="margin-left: 20px"
  278. >查询</el-button
  279. >
  280. </el-form-item>
  281. <el-form-item prop="refundType" label="退款类型">
  282. <el-select
  283. v-model="addRefund.refundType"
  284. placeholder="请选择"
  285. style="width: 300px"
  286. >
  287. <el-option
  288. v-for="item in refundType"
  289. :key="item.value"
  290. :label="item.label"
  291. :value="item.value"
  292. />
  293. </el-select>
  294. </el-form-item>
  295. <el-form-item prop="contactId" label="商品名">
  296. <el-select
  297. v-model="addRefund.orderCode"
  298. placeholder="请选择"
  299. style="width: 300px"
  300. @change="handleSelectionChange"
  301. >
  302. <el-option
  303. v-for="item in goods"
  304. :key="item.value"
  305. :label="item.productName + item.orderCode"
  306. :value="item.orderCode"
  307. />
  308. </el-select>
  309. </el-form-item>
  310. <div style="display: flex; align-items: center">
  311. <el-form-item prop="rechargeCoin" label="充值金币" style="float: left">
  312. <el-input
  313. v-model="addRefund.rechargeCoin"
  314. style="width: 100px"
  315. disabled
  316. />
  317. <p></p>
  318. </el-form-item>
  319. <el-form-item
  320. prop="freeCoin"
  321. label="免费金币"
  322. style="margin-left: -20px; float: left"
  323. >
  324. <el-input
  325. v-model="addRefund.freeCoin"
  326. style="float: left; width: 100px"
  327. disabled
  328. />
  329. <p></p>
  330. </el-form-item>
  331. <el-form-item prop="taskCoin" label="任务金币" style="margin-left: -20px">
  332. <el-input
  333. v-model="addRefund.taskCoin"
  334. style="float: left; width: 100px"
  335. disabled
  336. />
  337. <p></p>
  338. </el-form-item>
  339. </div>
  340. <el-form-item prop="allCoin" label="退款金币总数">
  341. <el-input disabled v-model="addRefund.allCoin" style="width: 100px">
  342. </el-input>
  343. </el-form-item>
  344. <el-form-item prop="remark" label="备注">
  345. <el-input
  346. v-model="addRefund.remark"
  347. style="width: 300px"
  348. :rows="2"
  349. maxlength="100"
  350. show-word-limit
  351. type="textarea"
  352. />
  353. </el-form-item>
  354. <el-form-item prop="commitName" label="提交人">
  355. <el-input
  356. style="width: 300px"
  357. :value="adminData.name"
  358. disabled
  359. placeholder="提交人姓名"
  360. />
  361. </el-form-item>
  362. <el-button @click="cancel()" style="margin-left: 280px">重置</el-button>
  363. <el-button type="primary" @click="addBefore"> 提交 </el-button>
  364. </el-form>
  365. <!-- 客户信息栏 -->
  366. <el-card style="width: 850px; float: right" class="customer-info">
  367. <el-form
  368. :model="user"
  369. label-width="auto"
  370. style="max-width: 1000px"
  371. label-position="left"
  372. >
  373. <el-text size="large" style="margin-left: 20px">客户信息</el-text>
  374. <el-row style="margin-top: 20px">
  375. <el-col :span="10">
  376. <el-form-item label="姓名:">
  377. <p>{{ user.name }}</p>
  378. </el-form-item>
  379. </el-col>
  380. <el-col :span="14">
  381. <el-form-item label="历史金币总数">
  382. <p>{{ user.totalRechargeGold }}</p>
  383. </el-form-item>
  384. </el-col>
  385. <el-col :span="10">
  386. <el-form-item label="精网号">
  387. <p>{{ user.jwcode }}</p>
  388. </el-form-item>
  389. </el-col>
  390. <el-col :span="14">
  391. <el-form-item label="当前金币总数" style="width: 500px">
  392. <span style="color: #2fa1ff; margin-right: 5px" v-if="user.buyJb">{{
  393. user.buyJb + user.free6 + user.free12 + user.coreJb
  394. }}</span>
  395. <span
  396. style="display: inline; white-space: nowrap; color: #b1b1b1"
  397. v-if="user.buyJb"
  398. >(充值金币:{{ user.buyJb }};免费金币:{{
  399. user.free6 + user.free12
  400. }};任务金币:{{ user.coreJb }})</span
  401. >
  402. </el-form-item>
  403. </el-col>
  404. <el-col :span="10">
  405. <el-form-item label="首次充值日期">
  406. <p v-if="user.firstRechargeDate">
  407. {{ moment(user.firstRechargeDate).format("YYYY-MM-DD HH:mm:ss") }}
  408. </p>
  409. </el-form-item>
  410. </el-col>
  411. <el-col :span="14">
  412. <el-form-item label="充值次数">
  413. <p style="color: #2fa1ff">{{ user.rechargeTimes }}</p>
  414. </el-form-item>
  415. </el-col>
  416. <el-col :span="10">
  417. <el-form-item label="负责客服">
  418. <p>{{ adminData.name }}</p>
  419. </el-form-item>
  420. </el-col>
  421. <el-col :span="14">
  422. <el-form-item label="消费次数">
  423. <p style="color: #2fa1ff">{{ user.spendTimes }}</p>
  424. </el-form-item>
  425. </el-col>
  426. <el-col :span="10">
  427. <el-form-item label="所属门店">
  428. <p>{{ adminData.area }}</p>
  429. </el-form-item>
  430. </el-col>
  431. <el-col :span="14">
  432. <el-form-item label="待审核">
  433. <p style="color: #2fa1ff">
  434. {{ user.A }}
  435. </p>
  436. </el-form-item>
  437. </el-col>
  438. </el-row>
  439. </el-form>
  440. </el-card>
  441. </template>
  442. <style scoped>
  443. p {
  444. margin: 0px;
  445. }
  446. .el-form-item {
  447. margin-left: 50px;
  448. }
  449. /* 上传图片的格式 */
  450. .avatar-uploader .avatar {
  451. width: 50px;
  452. height: 50px;
  453. display: block;
  454. }
  455. </style>
  456. <style>
  457. .avatar-uploader .el-upload {
  458. border: 1px dashed var(--el-border-color);
  459. border-radius: 6px;
  460. cursor: pointer;
  461. position: relative;
  462. overflow: hidden;
  463. transition: var(--el-transition-duration-fast);
  464. }
  465. .avatar-uploader .el-upload:hover {
  466. border-color: var(--el-color-primary);
  467. }
  468. .el-icon.avatar-uploader-icon {
  469. font-size: 28px;
  470. color: #8c939d;
  471. width: 50px;
  472. height: 50px;
  473. text-align: center;
  474. }
  475. .form-style {
  476. margin-top: 50px;
  477. max-width: 50%;
  478. float: left;
  479. }
  480. .form-style2 {
  481. max-width: 60%;
  482. }
  483. p {
  484. font-size: 13px;
  485. transform: scale(1);
  486. }
  487. </style>