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.

546 lines
15 KiB

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