addEditor.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <div class="w-full h-full flex flex-col">
  3. <div class="flex-1 overflow-y-auto">
  4. <FoldingPanel :title="Object.keys(formVal).length > 0 ? '修改商机' : '新建商机'">
  5. <template #foldContainer>
  6. <CustomerForm ref="formFormRef" :formJson="formJson" :formValue="formVal"></CustomerForm>
  7. </template>
  8. </FoldingPanel>
  9. <template v-for="(item, index) in businessItemProductList">
  10. <FoldingPanel :title="`相关产品(${index + 1})`">
  11. <template #foldingRight>
  12. <div class="flex items-center">
  13. <van-button icon="plus" color="#FF8B32" size="mini" class="relatedAddButton" @click="addBusinessItemProductList()">添加</van-button>
  14. <van-button icon="plus" color="#075985" size="mini" class="relatedAddButton" @click.stop="resetBusinessItemProductList(index)" v-if="businessItemProductList.length == 1">重置</van-button>
  15. <van-button icon="plus" color="#EE0A24" size="mini" class="relatedAddButton" @click.stop="deleteBusinessItemProductList(index)" v-if="businessItemProductList.length > 1">删除</van-button>
  16. </div>
  17. </template>
  18. <template #foldContainer>
  19. <NewAndModifiedRelatedProducts :form="item" />
  20. </template>
  21. </FoldingPanel>
  22. </template>
  23. </div>
  24. <div class="mar-20px ">
  25. <van-button type="primary" @click="onSubmit" class="w-full">
  26. {{ Object.keys(formVal).length > 0 ? '确定修改' : '确定添加' }}
  27. </van-button>
  28. </div>
  29. </div>
  30. </template>
  31. <script setup>
  32. import { ref, onActivated } from 'vue';
  33. import { useLifecycle } from '@hooks/useCommon.js';
  34. import { GET_BUSINESS_OPPORTUNITY_DETAILS, NEW_BUSINESS_OPPORTUNITY_EDITING } from "@hooks/useApi"
  35. import { defaultRelatedProductDataFields } from "@utility/defaultData"
  36. import dayjs from 'dayjs';
  37. import requests from "@common/requests";
  38. import useToast from "@hooks/useToast"
  39. import CustomerForm from '@components/common/formForm/formView.vue'
  40. import FoldingPanel from '@components/common/foldingPanel.vue';
  41. import NewAndModifiedRelatedProducts from '@pages/pageComponents/product/newAndModifiedRelatedProducts.vue'
  42. import useRouterStore from "@store/useRouterStore.js";
  43. const router = useRouterStore()
  44. const props = defineProps({
  45. formJson: { required: true },
  46. formValue: { required: true },
  47. });
  48. const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
  49. const formFormRef = ref(null)
  50. const formVal = ref({})
  51. const businessItemProductList = ref([{...defaultRelatedProductDataFields}])
  52. function onSubmit() {
  53. formFormRef.value.getJsonData().then((res) => {
  54. if(!res.data) {
  55. return
  56. }
  57. const newList = businessItemProductList.value.filter(item => item.productId)
  58. const flagVal = judgmentaAmounteEqual(res.data, newList)
  59. if(flagVal) {
  60. return
  61. }
  62. newList.forEach((item) => {
  63. item.typeName = item.productType
  64. delete item.id
  65. })
  66. const newForm = {
  67. ...props.formValue,
  68. ...res.data,
  69. expectedTransactionDate: res.data.expectedTransactionDate ? dayjs(new Date(res.data.expectedTransactionDate)).format('YYYY-MM-DD') : '',
  70. businessItemProductList: newList ? JSON.stringify(newList) : []
  71. }
  72. toastLoading('保存中', 0)
  73. requests.post(NEW_BUSINESS_OPPORTUNITY_EDITING, { ...newForm }).then(() => {
  74. toastSuccess('保存成功')
  75. setTimeout(() => {
  76. router.navigateBack({
  77. success: () => {
  78. router.eventEmit('moduleListRefreshData', {})
  79. }
  80. })
  81. }, 2000)
  82. }).catch((err) => {
  83. toastFail('保存失败:' + err.msg)
  84. })
  85. })
  86. }
  87. function judgmentaAmounteEqual(mob, arr) {
  88. if(!arr || arr.length <= 0) {
  89. return false;
  90. }
  91. let flag = false;
  92. const amounte = +mob.amountOfMoney || 0;
  93. const totalAmounte = arr.reduce((pre, cur) => pre + (+cur.totalPrice || 0), 0);
  94. console.log(amounte, totalAmounte)
  95. if (amounte != totalAmounte) {
  96. toastText(`商机金额${amounte > totalAmounte ? '大于' : '小于'}产品总金额,${amounte > totalAmounte ? '保存中...' : '请修改'}`)
  97. flag = true;
  98. }
  99. return (amounte > totalAmounte) ? false : flag;
  100. }
  101. function addBusinessItemProductList() {
  102. businessItemProductList.value.push({ ...defaultRelatedProductDataFields })
  103. }
  104. function resetBusinessItemProductList(index) {
  105. businessItemProductList.value.splice(index, 1, { ...defaultRelatedProductDataFields })
  106. }
  107. function deleteBusinessItemProductList(index) {
  108. businessItemProductList.value.splice(index, 1)
  109. }
  110. function getBusinessOpportunityDetails(row) {
  111. const { id } = row
  112. if(!id) {
  113. businessItemProductList.value = [{...defaultRelatedProductDataFields}]
  114. return
  115. }
  116. requests.post(GET_BUSINESS_OPPORTUNITY_DETAILS, { id }).then(({ data }) => {
  117. const { businessItemProducts } = data
  118. businessItemProductList.value = businessItemProducts.length > 0 ? businessItemProducts : [{...defaultRelatedProductDataFields}]
  119. console.log(businessItemProductList.value, '<==== businessItemProductList.value')
  120. })
  121. }
  122. useLifecycle({
  123. load: () => {
  124. formVal.value = props.formValue
  125. getBusinessOpportunityDetails(formVal.value)
  126. },
  127. init: () => {
  128. formVal.value = props.formValue
  129. getBusinessOpportunityDetails(formVal.value)
  130. }
  131. });
  132. onActivated(() => {
  133. })
  134. </script>
  135. <style lang='scss' scoped>
  136. /* 样式代码 */
  137. </style>