index.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <!-- 保税仓业务-进仓管理-提交申请 -->
  2. <template>
  3. <app-drawer class="bonded-inbound-apply" title="提交申请" v-model:show="show" :width="960" :loading="loading"
  4. :refresh="refresh">
  5. <h3 class="bonded-inbound-apply__title">发货信息</h3>
  6. <el-form ref="formRef" class="el-form--horizontal" label-width="100px" :model="formData" :rules="formRules">
  7. <el-form-item label="发货方" prop="UserName">
  8. <el-input placeholder="请输入" v-model="formData.UserName" />
  9. </el-form-item>
  10. <el-form-item label="发货地址" prop="UserAddress">
  11. <el-input placeholder="请输入" v-model="formData.UserAddress" />
  12. </el-form-item>
  13. <el-form-item label="联系人" prop="ContactName">
  14. <el-input placeholder="请输入" v-model="formData.ContactName" />
  15. </el-form-item>
  16. <el-form-item label="联系电话" prop="ContactNum">
  17. <el-input placeholder="请输入" v-model="formData.ContactNum" />
  18. </el-form-item>
  19. <el-form-item label="物流公司" prop="LogisticsCompany">
  20. <el-input placeholder="请输入" v-model="formData.LogisticsCompany" />
  21. </el-form-item>
  22. <el-form-item label="托运单号" prop="LogisticsNo">
  23. <el-input placeholder="请输入" v-model="formData.LogisticsNo" />
  24. </el-form-item>
  25. </el-form>
  26. <div class="bonded-inbound-apply__table">
  27. <app-table :data="orderDetailList" :columns="columns" :max-height="400" border>
  28. <template #header>
  29. <h3 class="bonded-inbound-apply__title">商品信息</h3>
  30. </template>
  31. <template #toolbar>
  32. <el-button-group>
  33. <el-button size="small" @click="openEdit()">新增</el-button>
  34. <el-button size="small" @click="orderDetailList = []">清空</el-button>
  35. </el-button-group>
  36. </template>
  37. <!-- 操作 -->
  38. <template #operate="{ row, index }">
  39. <el-button-group size="small">
  40. <el-button @click="openEdit(row)">修改</el-button>
  41. <el-button @click="deleteRecord(index)">删除</el-button>
  42. </el-button-group>
  43. </template>
  44. </app-table>
  45. </div>
  46. <template #footer>
  47. <el-button @click="onCancel(false)" plain>取消</el-button>
  48. <el-button type="primary" @click="onSubmit">提交</el-button>
  49. </template>
  50. <component :is="DetailEdit" v-bind="{ selectedRow }" @update="onUpdate" @closed="showEdit = false"
  51. v-if="showEdit" />
  52. </app-drawer>
  53. </template>
  54. <script lang="ts" setup>
  55. import { shallowRef, ref, defineAsyncComponent } from 'vue'
  56. import { ElMessage } from 'element-plus'
  57. import type { FormInstance, FormRules } from 'element-plus'
  58. import { validateRules } from '@/constants/regex'
  59. import { GZBSCOrderType } from '@/constants/bonded'
  60. import { useBscInAndOutWareHouseApply } from '@/business/bonded'
  61. import AppDrawer from '@pc/components/base/drawer/index.vue'
  62. import AppTable from '@pc/components/base/table/index.vue'
  63. const DetailEdit = defineAsyncComponent(() => import('../../../components/detail-edit/index.vue'))
  64. const { loading, formData, formSubmit } = useBscInAndOutWareHouseApply(GZBSCOrderType.In)
  65. const show = shallowRef(true)
  66. const refresh = shallowRef(false)
  67. const formRef = shallowRef<FormInstance>()
  68. const showEdit = shallowRef(false)
  69. const orderDetailList = ref<Ermcp.BScinOutOrderDetailRsp[]>([]) // 明细列表
  70. const selectedRow = shallowRef<Ermcp.BScinOutOrderDetailRsp>() // 当前选择的商品明细
  71. const columns: Ermcp.TableColumn[] = [
  72. { prop: 'goodsname', label: '商品名称' },
  73. { prop: 'goodsspec', label: '规格' },
  74. { prop: 'rawdetail', label: '成品对应原料明细', width: 160 },
  75. { prop: 'backagenum', label: '件数' },
  76. { prop: 'netweightct', label: '净重(克拉)' },
  77. { prop: 'netweightgm', label: '净重(克)' },
  78. { prop: 'bagweightgm', label: '连袋重(克)' },
  79. { prop: 'prepricegm', label: '单价(克)' },
  80. { prop: 'totalprice', label: '总价' },
  81. { prop: 'currencydes', label: '币种' },
  82. { prop: 'customsvalue', label: '报关总值' },
  83. { prop: 'origincountry', label: '原产国' },
  84. { prop: 'remark', label: '备注' },
  85. { prop: 'operate', label: '操作', width: 160, fixed: 'right' }
  86. ]
  87. const formRules: FormRules = {
  88. UserName: [{
  89. required: true,
  90. message: '请输入发货方'
  91. }],
  92. UserAddress: [{
  93. required: true,
  94. message: '请输入发货地址'
  95. }],
  96. ContactName: [{
  97. required: true,
  98. message: '请输入联系人'
  99. }],
  100. ContactNum: [{
  101. required: true,
  102. trigger: 'blur',
  103. validator: (rule, value, callback) => {
  104. if (value) {
  105. if (validateRules.phone.validate(value)) {
  106. callback()
  107. } else {
  108. callback(new Error(validateRules.phone.message))
  109. }
  110. } else {
  111. callback(new Error('请输入联系电话'))
  112. }
  113. }
  114. }],
  115. }
  116. // 打开商品编辑
  117. const openEdit = (row?: Ermcp.BScinOutOrderDetailRsp) => {
  118. selectedRow.value = row
  119. showEdit.value = true
  120. }
  121. // 删除商品记录
  122. const deleteRecord = (index: number) => {
  123. orderDetailList.value.splice(index, 1)
  124. orderDetailList.value.forEach((e, i) => e.detailid = (i + 1).toString()) // 重置序列
  125. }
  126. // 更新商品数据
  127. const onUpdate = (item: Ermcp.BScinOutOrderDetailRsp) => {
  128. const list = orderDetailList.value
  129. const index = list.findIndex((e) => e.detailid === item.detailid)
  130. if (index > -1) {
  131. list[index] = item
  132. } else {
  133. const n = list.length
  134. item.detailid = (n + 1).toString()
  135. list[n] = item
  136. }
  137. }
  138. const onCancel = (isRefresh = false) => {
  139. show.value = false
  140. refresh.value = isRefresh
  141. }
  142. const onSubmit = () => {
  143. formRef.value?.validate((valid) => {
  144. if (valid) {
  145. formData.BSCGoodsListDetails = orderDetailList.value.map((e) => ({
  146. GoodsID: e.goodsid, // 商品ID,必填
  147. GoodsSpec: e.goodsspec, // 规格,必填
  148. RawDetail: e.rawdetail, // 原料明细,必填
  149. BackageNum: e.backagenum, // 件数,必填
  150. NetWeightCT: e.netweightct, // 净重(克拉),必填
  151. NetWeightGM: e.netweightgm, // 净重(克),必填
  152. BagWeightGM: e.bagweightgm, // 连袋重(克),必填
  153. PrePriceGM: e.prepricegm, // 单价(克),必填
  154. TotalPrice: e.totalprice, // 总价,必填
  155. CurrencyDes: e.currencydes, // 币种,必填
  156. CustomsValue: e.customsvalue, // 报关总值,必填
  157. OriginCountry: e.origincountry, // 原产国,必填
  158. Remark: e.remark, // 备注,选填
  159. }))
  160. formSubmit().then(() => {
  161. ElMessage.success('提交成功')
  162. onCancel(true)
  163. }).catch((err) => {
  164. ElMessage.error('提交失败:' + err)
  165. })
  166. }
  167. })
  168. }
  169. </script>
  170. <style lang="less">
  171. @import './index.less';
  172. </style>