index.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <template>
  2. <ContentWrap>
  3. <!-- 搜索工作栏 -->
  4. <el-form
  5. class="-mb-15px"
  6. :model="queryParams"
  7. ref="queryFormRef"
  8. :inline="true"
  9. label-width="68px"
  10. >
  11. <el-form-item label="工厂" prop="factoryId">
  12. <el-select v-model="queryParams.factoryId" clearable placeholder="请选择" class="!w-240px" @change="selectedFactoryChange">
  13. <el-option
  14. v-for="item in factoryList"
  15. :key="item.id"
  16. :label="item.factoryName"
  17. :value="item.id!"
  18. />
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item label="库存地点" prop="storageLocationId">
  22. <el-select v-model="queryParams.storageLocationId" clearable placeholder="请选择" class="!w-240px">
  23. <el-option
  24. v-for="item in storageLocationList"
  25. :key="item.id"
  26. :label="item.storageLocationName"
  27. :value="item.id!"
  28. />
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item label="物料编码" prop="materialCode">
  32. <el-input
  33. v-model="queryParams.materialCode"
  34. placeholder="请输入物料编码"
  35. clearable
  36. @keyup.enter="handleQuery"
  37. class="!w-240px"
  38. />
  39. </el-form-item>
  40. <el-form-item label="物料名称" prop="materialName">
  41. <el-input
  42. v-model="queryParams.materialName"
  43. placeholder="请输入物料名称"
  44. clearable
  45. @keyup.enter="handleQuery"
  46. class="!w-240px"
  47. />
  48. </el-form-item>
  49. <el-form-item label="创建时间" prop="createTime">
  50. <el-date-picker
  51. v-model="queryParams.createTime"
  52. value-format="YYYY-MM-DD HH:mm:ss"
  53. type="daterange"
  54. start-placeholder="开始日期"
  55. end-placeholder="结束日期"
  56. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  57. class="!w-220px"
  58. />
  59. </el-form-item>
  60. <el-form-item label="是否配置安全库存" prop="configFlag" label-width="140px">
  61. <el-select
  62. v-model="queryParams.configFlag"
  63. placeholder="请选择"
  64. clearable
  65. class="!w-240px"
  66. >
  67. <el-option
  68. v-for="dict in resultOptions"
  69. :key="dict.value"
  70. :label="dict.label"
  71. :value="dict.value"
  72. />
  73. </el-select>
  74. </el-form-item>
  75. <el-form-item>
  76. <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  77. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  78. <el-button
  79. type="primary"
  80. plain
  81. @click="openForm('create')"
  82. v-hasPermi="['pms:iot-sap-stock:create']"
  83. >
  84. <Icon icon="ep:plus" class="mr-5px" /> 新增
  85. </el-button>
  86. <el-button
  87. type="success"
  88. plain
  89. @click="handleExport"
  90. :loading="exportLoading"
  91. v-hasPermi="['pms:iot-sap-stock:export']"
  92. >
  93. <Icon icon="ep:download" class="mr-5px" /> 导出
  94. </el-button>
  95. </el-form-item>
  96. </el-form>
  97. </ContentWrap>
  98. <!-- 列表 -->
  99. <ContentWrap>
  100. <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
  101. <el-table-column label="工厂" align="center" prop="factory" />
  102. <el-table-column label="库存地点" align="center" prop="projectDepartment" />
  103. <el-table-column label="物料编码" align="center" prop="materialCode" />
  104. <el-table-column label="物料名称" align="center" prop="materialName" />
  105. <el-table-column label="数量" align="center" prop="quantity" />
  106. <el-table-column label="单价" align="center" prop="unitPrice" />
  107. <el-table-column label="单位" align="center" prop="unit" />
  108. <el-table-column label="安全库存" align="center" prop="safetyStock" />
  109. <el-table-column
  110. label="创建时间"
  111. align="center"
  112. prop="createTime"
  113. :formatter="dateFormatter"
  114. width="180px"
  115. />
  116. <!--
  117. <el-table-column label="操作" align="center" min-width="120px">
  118. <template #default="scope">
  119. <el-button
  120. link
  121. type="primary"
  122. @click="openForm('update', scope.row.id)"
  123. v-hasPermi="['pms:iot-sap-stock:update']"
  124. v-if="false"
  125. >
  126. 安全库存
  127. </el-button>
  128. </template>
  129. </el-table-column> -->
  130. </el-table>
  131. <!-- 分页 -->
  132. <Pagination
  133. :total="total"
  134. v-model:page="queryParams.pageNo"
  135. v-model:limit="queryParams.pageSize"
  136. @pagination="getList"
  137. />
  138. </ContentWrap>
  139. <!-- 表单弹窗:添加/修改 -->
  140. <IotSapStockForm ref="formRef" @success="getList" />
  141. </template>
  142. <script setup lang="ts">
  143. import { dateFormatter } from '@/utils/formatTime'
  144. import download from '@/utils/download'
  145. import { IotSapStockApi, IotSapStockVO } from '@/api/pms/iotsapstock'
  146. import IotSapStockForm from './IotSapStockForm.vue'
  147. import * as SapOrgApi from "@/api/system/saporg";
  148. /** PMS SAP 库存(通用库存/项目部库存) 列表 */
  149. defineOptions({ name: 'IotSapStock' })
  150. const message = useMessage() // 消息弹窗
  151. const { t } = useI18n() // 国际化
  152. const factoryList = ref([] as SapOrgApi.SapOrgVO[]) // 工厂列表
  153. const storageLocationList = ref([] as SapOrgApi.SapOrgVO[]) // 库存地点列表
  154. const loading = ref(true) // 列表的加载中
  155. const list = ref<IotSapStockVO[]>([]) // 列表的数据
  156. const total = ref(0) // 列表的总页数
  157. const queryParams = reactive({
  158. pageNo: 1,
  159. pageSize: 10,
  160. deptId: undefined,
  161. factoryId: undefined,
  162. factory: undefined,
  163. storageLocationId: undefined,
  164. projectDepartment: undefined,
  165. materialCode: undefined,
  166. materialName: undefined,
  167. materialGroupName: undefined,
  168. materialGroupId: undefined,
  169. quantity: undefined,
  170. unitPrice: undefined,
  171. unit: undefined,
  172. safetyStock: undefined,
  173. shelvesId: undefined,
  174. cargoLocationId: undefined,
  175. type: undefined,
  176. syncStatus: undefined,
  177. syncTime: [],
  178. syncError: undefined,
  179. sort: undefined,
  180. status: undefined,
  181. remark: undefined,
  182. configFlag: 'A',
  183. createTime: [],
  184. })
  185. const queryFormRef = ref() // 搜索的表单
  186. const exportLoading = ref(false) // 导出的加载中
  187. /** 查询列表 */
  188. const getList = async () => {
  189. loading.value = true
  190. try {
  191. const data = await IotSapStockApi.getIotSapStockPage(queryParams)
  192. list.value = data.list
  193. total.value = data.total
  194. } finally {
  195. loading.value = false
  196. }
  197. // 加载工厂(SAP)列表
  198. factoryList.value = await SapOrgApi.SapOrgApi.getSimpleSapOrgList(1)
  199. // 加载库存地点(SAP)列表
  200. storageLocationList.value = await SapOrgApi.SapOrgApi.getSimpleSapOrgList(3)
  201. }
  202. /** 搜索按钮操作 */
  203. const handleQuery = () => {
  204. queryParams.pageNo = 1
  205. getList()
  206. }
  207. /** 重置按钮操作 */
  208. const resetQuery = () => {
  209. queryFormRef.value.resetFields()
  210. handleQuery()
  211. }
  212. /** 添加/修改操作 */
  213. const formRef = ref()
  214. const openForm = (type: string, id?: number) => {
  215. formRef.value.open(type, id)
  216. }
  217. const selectedFactoryReqVO = ref({
  218. type: 0, // 类型(1工厂 2成本中心 3库位)
  219. factoryCodes: [] // 已经选择的SAP工厂code 列表
  220. })
  221. /** 已经选择了 SAP工厂 */
  222. const selectedFactoryChange = async (selectedId: number | undefined) => {
  223. // 获取选中的factoryCode数组
  224. const selectedFactory = factoryList.value.find(item => item.id === selectedId)
  225. const selectedFactoryCodes = selectedFactory ? [selectedFactory.factoryCode] : []
  226. // 获得已经选择的 SAP 工厂 数组
  227. // const factoryIds = formData.value.factoryIds
  228. console.log('选择的工厂代码:', selectedFactoryCodes)
  229. // 根据选择的 SAP工厂 调用后台接口查询 SAP工厂下属的 库存地点列表
  230. selectedFactoryReqVO.value.type = 3
  231. selectedFactoryReqVO.value.factoryCodes = selectedFactoryCodes
  232. storageLocationList.value = await SapOrgApi.SapOrgApi.getSelectedList(selectedFactoryReqVO.value)
  233. }
  234. // 是否已经配置了安全库存 下拉列表 模拟字典项
  235. const resultOptions = computed(() => [
  236. {
  237. label: '全部',
  238. value: 'A' // 空值会触发 clearable 效果
  239. },
  240. {
  241. label: '是',
  242. value: 'Y' // 空值会触发 clearable 效果
  243. },
  244. {
  245. label: '否',
  246. value: 'N' // 空值会触发 clearable 效果
  247. },
  248. ])
  249. /** 删除按钮操作 */
  250. const handleDelete = async (id: number) => {
  251. try {
  252. // 删除的二次确认
  253. await message.delConfirm()
  254. // 发起删除
  255. await IotSapStockApi.deleteIotSapStock(id)
  256. message.success(t('common.delSuccess'))
  257. // 刷新列表
  258. await getList()
  259. } catch {}
  260. }
  261. /** 导出按钮操作 */
  262. const handleExport = async () => {
  263. try {
  264. // 导出的二次确认
  265. await message.exportConfirm()
  266. // 发起导出
  267. exportLoading.value = true
  268. const data = await IotSapStockApi.exportIotSapStock(queryParams)
  269. download.excel(data, 'PMS SAP 库存(通用库存/项目部库存).xls')
  270. } catch {
  271. } finally {
  272. exportLoading.value = false
  273. }
  274. }
  275. /** 初始化 **/
  276. onMounted(() => {
  277. getList()
  278. })
  279. </script>