form.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <template>
  2. <xn-form-container
  3. :title="formData.id ? '编辑运费结算' : '增加运费结算'"
  4. :width="width"
  5. v-model:open="open"
  6. :destroy-on-close="true"
  7. @close="onClose"
  8. >
  9. <a-form ref="formRef" :model="formData" :rules="formRules" :label-col="labelCol" :wrapper-col="wrapperCol">
  10. <a-form-item label="结算类型:" name="settleType" v-show="isShow">
  11. <a-input v-model:value="formData.settleType" placeholder="请输入结算类型" allow-clear />
  12. </a-form-item>
  13. <a-form-item label="结算金额:" name="settleAccount" v-show="isShow">
  14. <a-input v-model:value="formData.settleAccount" placeholder="请输入结算金额" allow-clear />
  15. </a-form-item>
  16. <a-tooltip title="点击添加物流订单">
  17. <a-button size="small" @click="itemRef.showModal('checkbox', 'orderItem')"> 选择物流订单 </a-button>
  18. </a-tooltip>
  19. <table class="table">
  20. <tr>
  21. <td>订单编号</td>
  22. <td>客户名称</td>
  23. <td>货品名称</td>
  24. <td>货品编码</td>
  25. <td>供应商名称</td>
  26. <td>订单重量</td>
  27. <td>实际托运重量</td>
  28. <td>运费单价</td>
  29. <td>操作</td>
  30. </tr>
  31. <tr v-for="(order, index) in formData.orderList">
  32. <td>
  33. <a-tooltip :title="order.orderNumber">
  34. {{ order.orderNumber }}
  35. </a-tooltip>
  36. </td>
  37. <td>
  38. <a-tooltip :title="order.customerName">
  39. {{ order.customerName }}
  40. </a-tooltip>
  41. </td>
  42. <td>
  43. <a-tooltip :title="order.goodsName">
  44. {{ order.goodsName }}
  45. </a-tooltip>
  46. </td>
  47. <td>
  48. <a-tooltip :title="order.goodsCode">
  49. {{ order.goodsCode }}
  50. </a-tooltip>
  51. </td>
  52. <td>
  53. <a-tooltip :title="order.supplierName">
  54. {{ order.supplierName }}
  55. </a-tooltip>
  56. </td>
  57. <td>
  58. <a-tooltip :title="order.orderWeight">
  59. {{ order.orderWeight }}
  60. </a-tooltip>
  61. </td>
  62. <td>
  63. <a-tooltip :title="order.orderWeight">
  64. {{ order.orderType == '1'? order.shippingWeight:order.netWeight }}
  65. </a-tooltip>
  66. </td>
  67. <td>
  68. <a-tooltip :title="order.freightPrice">
  69. {{ order.freightPrice }}
  70. </a-tooltip>
  71. </td>
  72. <td>
  73. <a-button
  74. danger
  75. size="small"
  76. type="link"
  77. @click="deleteCount(index)"
  78. >
  79. <delete-outlined />
  80. </a-button>
  81. </td>
  82. </tr>
  83. <tr v-if="formData.orderList.length>0">
  84. <th colspan="1">合计</th>
  85. <td colspan="8">
  86. {{amountTotal}}
  87. </td>
  88. </tr>
  89. </table>
  90. </a-form>
  91. <template #footer>
  92. <a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
  93. <a-button type="primary" @click="onSubmit" :loading="submitLoading">保存</a-button>
  94. </template>
  95. <OrderItem ref="itemRef" @orderItemCallBack="orderItemCallBack" />
  96. </xn-form-container>
  97. </template>
  98. <script setup name="bizSettleForm">
  99. import { cloneDeep } from 'lodash-es'
  100. import { required } from '@/utils/formRules'
  101. import { message, Modal } from 'ant-design-vue'
  102. import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
  103. import { createVNode } from 'vue'
  104. import bizSettleApi from '@/api/biz/bizSettleApi'
  105. import OrderItem from './orderItem.vue'
  106. // 抽屉状态
  107. const open = ref(false)
  108. const emit = defineEmits({ successful: null })
  109. const formRef = ref()
  110. const itemRef = ref()
  111. const amountTotal = ref()
  112. const isShow = ref(false)
  113. // 表单数据
  114. const formData = ref({orderList:[]})
  115. const submitLoading = ref(false)
  116. const width = ref('calc(70%)')
  117. const labelCol = ref({ span: 3 })
  118. const wrapperCol = ref({ span: 21 })
  119. // 打开抽屉
  120. const onOpen = (record) => {
  121. open.value = true
  122. if (record) {
  123. //let recordData = cloneDeep(record)
  124. //formData.value = Object.assign({}, recordData)
  125. bizSettleApi.detailOrder({id:record.id}).then((res)=>{
  126. formData.value = res
  127. amountTotal.value = 0
  128. formData.value.orderList.forEach((item) => {
  129. amountTotal.value = amountTotal.value + (item.orderType=='1' ? item.freightPrice*item.shippingWeight : item.freightPrice*item.netWeight)
  130. })
  131. formData.value.settleAccount = amountTotal.value
  132. })
  133. }
  134. }
  135. // 关闭抽屉
  136. const onClose = () => {
  137. formRef.value.resetFields()
  138. formData.value = {orderList:[]}
  139. open.value = false
  140. }
  141. //删除明细
  142. const deleteCount = (index) =>{
  143. formData.value.orderList.splice(index, 1)
  144. amountTotal.value = 0
  145. formData.value.orderList.forEach((item) => {
  146. amountTotal.value = amountTotal.value + (item.orderType=='1' ? item.freightPrice*item.shippingWeight : item.freightPrice*item.netWeight)
  147. })
  148. formData.value.settleAccount = amountTotal.value
  149. }
  150. // 默认要校验的
  151. const formRules = {
  152. }
  153. // 验证并提交数据
  154. const onSubmit = () => {
  155. formRef.value
  156. .validate()
  157. .then(() => {
  158. submitLoading.value = true
  159. const formDataParam = cloneDeep(formData.value)
  160. bizSettleApi
  161. .bizSettleSubmitForm(formDataParam, formDataParam.id)
  162. .then(() => {
  163. onClose()
  164. emit('successful')
  165. })
  166. .finally(() => {
  167. submitLoading.value = false
  168. })
  169. })
  170. .catch(() => {})
  171. }
  172. const orderItemCallBack = (value) => {
  173. if (value && value.length > 0) {
  174. console.log('---this.value--->' + JSON.stringify(value))
  175. if (formData.value.orderList && formData.value.orderList.length > 0) {
  176. let map = new Map()
  177. const array = ref([])
  178. formData.value.orderList = formData.value.orderList.concat(value)
  179. formData.value.orderList.forEach((item) => {
  180. if (!map.has(item.id)) {
  181. map.set(item.id, item)
  182. array.value = array.value.concat(item)
  183. }
  184. })
  185. formData.value.orderList = array.value
  186. } else {
  187. formData.value.orderList = value
  188. }
  189. amountTotal.value = 0
  190. formData.value.orderList.forEach((item) => {
  191. amountTotal.value = amountTotal.value + (item.orderType=='1' ? item.freightPrice*item.shippingWeight : item.freightPrice*item.netWeight)
  192. })
  193. formData.value.settleType = '1'
  194. formData.value.settleAccount = amountTotal.value
  195. }
  196. }
  197. // 抛出函数
  198. defineExpose({
  199. onOpen
  200. })
  201. </script>
  202. <style scoped>
  203. table {
  204. margin-top: 10px;
  205. text-align: center;
  206. width: 100%;
  207. }
  208. table td {
  209. border: 1px solid #f0f2f5;
  210. padding: 10px 0;
  211. }
  212. tr:hover {
  213. background-color: #f5f5f5;
  214. }
  215. </style>