OutStockApply.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <script setup lang="ts">
  2. import type {FormInstance} from 'element-plus'
  3. import {ElMessage, ElMessageBox} from 'element-plus'
  4. import {useRouter} from 'vue-router'
  5. import {GlobalStore} from '@/stores'
  6. import {Delete, Edit, Van, View} from '@element-plus/icons-vue'
  7. import {nextTick, reactive, ref} from 'vue'
  8. import TableBase from '@/components/TableBase/index.vue'
  9. import type {ColumnProps} from '@/components/TableBase/interface'
  10. import {stockOutExcelBatch, Storehouse_StockOut_Apply_Del, Storehouse_StockOut_Apply_List,} from '@/api/storehouse'
  11. import {depotHooks} from '@/hooks/useDepot'
  12. import OutStorageEdit from './modules/OutStorageEdit.vue'
  13. import {paymentMethodOptions} from '@/hooks/useTablePublic'
  14. const router = useRouter()
  15. const formLabelWidth = ref('120px')
  16. const globalStore = GlobalStore()
  17. const ruleFormRef = ref<FormInstance>()
  18. const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
  19. const multipleSelection = ref<any[]>([])
  20. const columns: ColumnProps[] = [
  21. {type: 'selection', width: '44px', fixed: 'left'},
  22. {type: 'index', label: '序号', width: 80},
  23. {prop: 'T_number', label: '出库单号'},
  24. {prop: 'T_application_date', label: '申请日期'},
  25. {prop: 'T_state_str', label: '状态', name: 'T_state_str'},
  26. {prop: 'T_company_name', label: '公司名称'},
  27. {prop: 'T_payment_method', label: '付款方式', name: 'T_payment_method', width: 150},
  28. {prop: 'T_receive_name', label: '领取人'},
  29. {prop: 'T_depot_name', label: '出库仓库'},
  30. {prop: 'T_date', label: '出库日期'},
  31. {prop: 'T_project', label: '关联项目'},
  32. {prop: 'operation', label: '操作', width: 250, fixed: 'right', align: 'left '}
  33. ]
  34. const form = reactive({
  35. T_number: '',
  36. T_remark: '',
  37. T_delivery_type: '',
  38. T_signer_unit: '',
  39. T_signer: '',
  40. T_signer_phone: '',
  41. T_signer_date: '',
  42. T_courier_number: ''
  43. })
  44. // 搜索
  45. const stateOptions = reactive([
  46. {name: '待审批', id: 1},
  47. {name: '财务通过', id: 2},
  48. {name: '财务驳回', id: 3},
  49. {name: '总经理通过', id: 4},
  50. {name: '总经理驳回', id: 5},
  51. {name: '已出库', id: 6},
  52. ])
  53. /**
  54. * 查看详情
  55. */
  56. const preview = (number: string) => {
  57. router.push({name: 'OutStockDetail', params: {number}})
  58. }
  59. const OutStorageRef = ref()
  60. /**
  61. * 编辑
  62. */
  63. const previewEdit = (row: any) => {
  64. OutStorageRef.value?.openDrawer()
  65. OutStorageRef.value?.getStorehouseContractGet(row.T_number)
  66. for (let key in OutStorageRef.value?.form) {
  67. if (row.hasOwnProperty(key)) OutStorageRef.value.form[key] = row[key];
  68. }
  69. }
  70. // 搜索
  71. const T_date = ref<string[]>([])
  72. const initParam = reactive({
  73. User_tokey: globalStore.GET_User_tokey,
  74. T_end_date: '',
  75. T_start_date: '',
  76. T_depot_id: '',
  77. T_name: '',
  78. T_state:''
  79. })
  80. const searchHandle = () => {
  81. initParam.T_end_date = T_date.value ? T_date.value[1] : ''
  82. initParam.T_start_date = T_date.value ? T_date.value[0] : ''
  83. TableRef.value?.searchTable()
  84. }
  85. /**
  86. * 重置表单
  87. */
  88. const resetForm = (formEl: FormInstance | undefined) => {
  89. if (!formEl) return
  90. formEl.resetFields()
  91. }
  92. /**
  93. * 删除
  94. */
  95. const deleteFun = (row: any) => {
  96. ElMessageBox.confirm(
  97. '删除操作,是否立即删除?',
  98. '删除',
  99. {
  100. confirmButtonText: '立即删除',
  101. cancelButtonText: '取消',
  102. type: 'warning',
  103. center: true,
  104. }
  105. ).then(async () => {
  106. const result: any = await Storehouse_StockOut_Apply_Del({T_number: row})
  107. if (result.Code == 200) {
  108. ElMessage.success('删除成功')
  109. TableRef.value?.searchTable()
  110. }
  111. }).catch(() => {
  112. })
  113. }
  114. // 拿到仓库列表
  115. const {options} = depotHooks()
  116. // 保存选中的数据id,row-key就是要指定一个key标识这一行的数据
  117. const getRowKey = (row: any) => {
  118. return row.T_number
  119. }
  120. const stockOutExcelFun = async () => {
  121. if (multipleSelection.value.length === 0) {
  122. ElMessage.warning('请选择出库单!!!')
  123. return
  124. }
  125. let T_number_list = ''
  126. for (let item of multipleSelection.value) {
  127. T_number_list += item.T_number + '|'
  128. }
  129. const result: any = await stockOutExcelBatch({T_number_list: T_number_list})
  130. if (result.Code === 200) {
  131. window.open(result.Data)
  132. }
  133. nextTick(() => {
  134. multipleSelection.value = []
  135. TableRef.value?.clearSelection()
  136. })
  137. }
  138. const handleSelectionChange = (val: any[]) => {
  139. multipleSelection.value = val
  140. console.log(multipleSelection.value)
  141. }
  142. </script>
  143. <template>
  144. <div class="out-stock">
  145. <TableBase ref="TableRef" :columns="columns" :requestApi="Storehouse_StockOut_Apply_List" :initParam="initParam"
  146. :getRowKey="getRowKey"
  147. :selection-change="handleSelectionChange"
  148. >
  149. <template #table-header>
  150. <div class="input-suffix">
  151. <el-row :gutter="20" style="margin-bottom: 0">
  152. <el-col :xl="5" :lg="5" :md="5" style="display: flex">
  153. <span class="inline-flex items-center">出库编号:</span>
  154. <el-input
  155. v-model="initParam.T_name"
  156. class="w-50 m-2"
  157. type="text"
  158. placeholder="出库编号搜索"
  159. clearable
  160. @change="searchHandle"
  161. />
  162. </el-col>
  163. <el-col :xl="5" :lg="5" :md="5" style="display: flex">
  164. <span class="inline-flex items-center">状态:</span>
  165. <el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
  166. <el-option v-for="item in stateOptions" :key="item.id" :label="item.name"
  167. :value="item.id"/>
  168. </el-select>
  169. <el-button type="primary" @click="searchHandle">搜索</el-button>
  170. </el-col>
  171. <el-col :xl="14" :lg="14" :md="14" class="btn"
  172. >
  173. <el-button type="primary" @click="router.push('/receiveOutStockApply')">出库申请</el-button>
  174. <el-button type="success" icon="Download" @click="stockOutExcelFun">导出excel</el-button>
  175. </el-col>
  176. </el-row>
  177. </div>
  178. </template>
  179. <template #T_payment_method="{ row }">
  180. <el-text type="info">{{
  181. paymentMethodOptions.find((option: any) => option.id === row.T_payment_method)?.name || ''
  182. }}
  183. </el-text>
  184. </template>
  185. <template #T_state_str="{ row }">
  186. <el-text v-if="row.T_state_str === '待审批'" type="warning"> 待审批</el-text>
  187. <el-text v-if="row.T_state_str === '财务通过'" type="primary"> 财务通过</el-text>
  188. <el-text v-if="row.T_state_str === '财务驳回'" type="danger"> 财务驳回</el-text>
  189. <el-text v-if="row.T_state_str === '总经理通过'" type="primary"> 总经理通过</el-text>
  190. <el-text v-if="row.T_state_str === '总经理驳回'" type="danger"> 总经理驳回</el-text>
  191. <el-text v-if="row.T_state_str === '已出库'" type="success"> 已出库</el-text>
  192. </template>
  193. <template #right="{ row }">
  194. <el-button link type="success" size="small" :icon="View" @click="preview(row.T_number)">详情</el-button>
  195. <el-button link type="primary" size="small" :icon="Edit" @click="previewEdit(row)"
  196. :disabled="[2,4,6].includes(row.T_state)"
  197. >编辑
  198. </el-button>
  199. <el-button link type="danger" size="small" :icon="Delete" @click="deleteFun(row.T_number)"
  200. :disabled="[2,4,6].includes(row.T_state)"
  201. >删除
  202. </el-button>
  203. </template>
  204. </TableBase>
  205. <OutStorageEdit ref="OutStorageRef" :options="options" @onUpdateList="searchHandle"/>
  206. </div>
  207. </template>
  208. <style scoped lang="scss">
  209. @import '@/styles/var.scss';
  210. .out-stock {
  211. @include f-direction;
  212. :deep(.el-drawer__header) {
  213. margin-bottom: 0;
  214. }
  215. .input-suffix {
  216. width: 100%;
  217. .inline-flex {
  218. white-space: nowrap;
  219. }
  220. }
  221. .btn {
  222. display: flex;
  223. justify-content: right;
  224. .el-button {
  225. padding: 0 20px;
  226. }
  227. }
  228. }
  229. </style>