detail.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <script setup lang="ts">
  2. import { computed, reactive, ref } from "vue";
  3. import { importOrderGoodColumns, importInvoiceGoodColumns ,orderGoodColumns } from "./config/columns"
  4. import { useDetail } from "/@/hooks/core/useDetail";
  5. import BasicDescriptions from "/@/components/BasicDescriptions";
  6. import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
  7. import ChooseGoodModal from "./components/ChooseGoodModal/index.vue"
  8. import ChildGoodEditModal from "./components/ChildGoodEditModal.vue";
  9. import { httpDetail, httpStatus } from "/@/api/invoiceInOut/inOutManager";
  10. import { httpDetail as httpProductDetail } from "/@/api/invoiceInOut/productManager";
  11. import { ElButton, ElCollapse, ElCollapseItem, ElForm, ElMessage, ElTable, ElTableColumn, ElTooltip } from "element-plus";
  12. import ProductDetail from "/@/components/ProductDetail/index.vue"
  13. import { useTask } from "/@/hooks/core";
  14. import SealMonthPicker from "/@/components/SealMonthPicker/index.vue"
  15. import { useUserInfo } from "/@/hooks/core/useUser";
  16. const { title, collapses, id } = useDetail({ baseName: '入库', collapseLen: 5 });
  17. const visible = ref(false)
  18. // httpList
  19. const { isSuperUser } = useUserInfo()
  20. const productDetailTask = useTask()
  21. const detailTask = useTask({ success(data) {
  22. const { ProductRela } = data
  23. const { product_id } = ProductRela[0]
  24. productDetailTask.run(httpProductDetail({ id: product_id }))
  25. }})
  26. const productDetail = computed(() => {
  27. if (detailTask.data && detailTask.data.ProductRela){
  28. return detailTask.data.ProductRela[0]
  29. }
  30. return {}
  31. })
  32. const searchParameter = computed(() => {
  33. // 入库、入库红冲和出库红冲 只能选择真实成本的商品,出库类型可以选择预估成本商品
  34. if (!detailTask.data) return {}
  35. return { good_type: detailTask.data?.goodType }
  36. })
  37. const state = reactive({
  38. editVisible: false,
  39. index: -1,
  40. data: {}
  41. })
  42. const loading = ref(false)
  43. const formRef = ref<InstanceType<typeof ElForm> | null>(null)
  44. const formData = ref({ goods: [], month: '' })
  45. const rules = {
  46. goods: [{ required: true, message: '请选择操作商品' }],
  47. month: [{ required: true, message: '请选择入账月份' }]
  48. }
  49. function handleGoodComfirm(values: any[]){
  50. const ids = formData.value.goods.map(({ id }) => id)
  51. const list = []
  52. values.forEach(item => {
  53. if(!ids.includes(item.id)){ list.push(item) }
  54. })
  55. formData.value.goods = [...list, ...formData.value.goods]
  56. }
  57. function handleChildGoodEdit(index: number){
  58. state.index = index
  59. state.editVisible = true
  60. state.data = { ...formData.value.goods[index] }
  61. }
  62. function getSpanNumber(data, prop) {
  63. let length = Array.isArray(data) ? data.length : 0;
  64. if (length > 0) {
  65. let position = 0;
  66. let temp = data[0][prop];
  67. let result = [1];
  68. for (let i = 1; i < length; i++) {
  69. if (data[i][prop] == temp) {
  70. result[position] += 1;
  71. result[i] = 0;
  72. } else {
  73. position = i;
  74. result[i] = 1;
  75. temp = data[i][prop];
  76. }
  77. }
  78. return result;
  79. } else {
  80. return [0];
  81. }
  82. }
  83. function spanMethod({ row:_1, column:_2, rowIndex, columnIndex }: any){
  84. if ([0, 1, 2, 7].includes(Number(columnIndex))){
  85. let nameSpan = getSpanNumber(formData.value.goods, "id");
  86. return { rowspan: nameSpan[rowIndex], colspan: 1 };
  87. }
  88. }
  89. async function onSubmit(){
  90. try{
  91. await formRef.value.validate()
  92. const relaArrCopy = formData.value.goods.map(({ id, goodNum, unit_price, subunit_price }) => ({ id, num: goodNum, unit_price, subunit_price }))
  93. const relaArr = []
  94. const mapId = {}
  95. for(const item of relaArrCopy){
  96. if (!mapId[item.id]){
  97. relaArr.push(item)
  98. mapId[item.id] = true
  99. }
  100. }
  101. loading.value = true
  102. const { code, message } = await httpStatus({ relaArr, manager_id: id.value })
  103. loading.value = false
  104. if (code == 0) {
  105. ElMessage.success('操作完成')
  106. detailTask.run(httpDetail({ id: id.value }))
  107. } else {
  108. ElMessage.warning(message)
  109. }
  110. }catch(err){
  111. console.log(err)
  112. }
  113. }
  114. function handleEditGood(index, data){
  115. const { id } = formData.value.goods[index]
  116. formData.value.goods.forEach((item, index) => {
  117. if(item.id === id){
  118. formData.value.goods[index].goodNum = data.goodNum
  119. if(formData.value.goods[index].childNum){ formData.value.goods[index].childActionNum = formData.value.goods[index].childNum * data.goodNum }
  120. }
  121. })
  122. }
  123. function handleDelete(index){
  124. const { id } = formData.value.goods[index]
  125. formData.value.goods = formData.value.goods.filter((item) => item.id !== id)
  126. }
  127. id.value && detailTask.run(httpDetail({ id: id.value }))
  128. </script>
  129. <template>
  130. <div class="padding__container" v-loading="detailTask.loading">
  131. <ElCollapse v-model="collapses">
  132. <ElCollapseItem :title="title" name="1">
  133. <BasicDescriptions :columns="orderGoodColumns" :data="detailTask.data" v-if="detailTask.data" />
  134. </ElCollapseItem>
  135. <ElCollapseItem :title="'订单详情'" name="2">
  136. <BasicDescriptions v-if="detailTask.data" :columns="importOrderGoodColumns" :data="detailTask.data" />
  137. </ElCollapseItem>
  138. <ElCollapseItem :title="'发票详情'" name="3">
  139. <BasicDescriptions v-if="detailTask.data" :columns="importInvoiceGoodColumns" :data="detailTask.data" />
  140. </ElCollapseItem>
  141. <ElCollapseItem title="商品信息" name="4" v-if="productDetailTask.data && detailTask.data.status == '2'">
  142. <ProductDetail
  143. :data="productDetailTask.data"
  144. :num="productDetail?.num"
  145. :time="productDetail?.create_time"
  146. />
  147. </ElCollapseItem>
  148. <ElCollapseItem
  149. title="出入库信息确认"
  150. name="5"
  151. v-if="!isSuperUser && detailTask.data && detailTask.data.status == '1' || detailTask.data.status == '4'">
  152. <ElForm ref="formRef" :rules="rules" :model="formData">
  153. <ElFormItem label="操作商品" prop="goods">
  154. <ElTable :span-method="spanMethod" border size="small" :data="formData.goods">
  155. <ElTableColumn label="商品编号" prop="skuCode" show-overflow-tooltip />
  156. <ElTableColumn label="商品名称" prop="goodName" show-overflow-tooltip />
  157. <ElTableColumn label="操作数量" prop="goodNum" show-overflow-tooltip />
  158. <ElTableColumn label="子商品编号" prop="childCode" show-overflow-tooltip />
  159. <ElTableColumn label="销售方公司纳税识别号" width="140px" prop="seller_code" show-overflow-tooltip />
  160. <ElTableColumn label="子商品比例" prop="childNum" show-overflow-tooltip />
  161. <ElTableColumn label="子商品操作数量" prop="childActionNum" show-overflow-tooltip />
  162. <ElTableColumn width="70px" label="操作">
  163. <template #header>
  164. <div class="w-full flex justify-between">
  165. <span>操作</span>
  166. <ElTooltip content="添加" placement="top">
  167. <ElButton link size="small" type="primary" :icon="useRenderIcon('add')"
  168. @click="visible = true" />
  169. </ElTooltip>
  170. </div>
  171. </template>
  172. <template #="{ $index }">
  173. <ElTooltip content="编辑" placement="top">
  174. <ElButton :icon="useRenderIcon('edits')" type="primary" size="small" link
  175. @click="handleChildGoodEdit($index)" />
  176. </ElTooltip>
  177. <ElTooltip content="删除" placement="top">
  178. <ElButton :icon="useRenderIcon('delete')" @click="handleDelete($index)" type="danger"
  179. size="small" link />
  180. </ElTooltip>
  181. </template>
  182. </ElTableColumn>
  183. </ElTable>
  184. </ElFormItem>
  185. <ElFormItem label="入账月份" prop="month">
  186. <SealMonthPicker
  187. placeholder="入账月份"
  188. v-model="formData.month"
  189. :company_code="detailTask.data.seller_code" />
  190. </ElFormItem>
  191. </ElForm>
  192. <div class="flex w-full justify-end">
  193. <ElButton type="primary" @click="onSubmit">保存</ElButton>
  194. </div>
  195. </ElCollapseItem>
  196. </ElCollapse>
  197. <ChooseGoodModal
  198. v-model:visible="visible"
  199. :otherSearchParameter="searchParameter"
  200. @submit="handleGoodComfirm"
  201. />
  202. <ChildGoodEditModal
  203. :data="state.data"
  204. :index="state.index"
  205. v-model:visible="state.editVisible"
  206. @submit="handleEditGood"
  207. />
  208. </div>
  209. </template>