金币系统前端
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.

538 lines
15 KiB

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