You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

addOrUpdate.vue 29KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  1. <template>
  2. <div>
  3. <el-form label-position="right" label-width="140px" :model="addForm" :rules="rules"
  4. :ref="(el) => dataFormRef = el" v-loading="formLoding" :inline-message="true">
  5. <el-card class="box-card">
  6. <template #header>
  7. <div class="card-header">
  8. <span>基础信息</span>
  9. </div>
  10. </template>
  11. <div>
  12. <el-form-item label="备货单号" prop="applyNo" v-if="typeOption !== 'add'">
  13. <el-input maxlength="60" v-trim clearable v-model="addForm.applyNo" :disabled="true"/>
  14. </el-form-item>
  15. <el-form-item label="入库仓库名称" prop="storeCode">
  16. <el-select clearable v-model="addForm.storeCode" placeholder="请选择仓库名称"
  17. :disabled="typeOption === 'view' || typeOption === 'sure'">
  18. <el-option v-for="item in interfaceLowerListArr" :key="item.code" :label="item.name"
  19. :value="item.code"/>
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="产权" prop="ownType">
  23. <el-select clearable v-model="addForm.ownType" placeholder="请选择产权"
  24. :disabled="typeOption === 'view' || typeOption === 'sure'">
  25. <el-option v-for="item in OWN_TYPE" :key="item.value" :label="item.label"
  26. :value="item.value"/>
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="入库设备类型" prop="inventoryType">
  30. <el-select clearable v-model="addForm.inventoryType" placeholder="请选择入库设备类型"
  31. :disabled="typeOption === 'view' || typeOption === 'sure'" @change="changeDeviceType">
  32. <el-option v-for="item in deviceTypeList" :key="item.value" :label="item.label"
  33. :value="item.value"/>
  34. </el-select>
  35. </el-form-item>
  36. <el-form-item label="设备型号" prop="version">
  37. <el-select clearable v-model="addForm.version" placeholder="请选择设备型号"
  38. :disabled="typeOption === 'view' || typeOption === 'sure'">
  39. <el-option v-if="addForm.inventoryType === 'CARD'" v-for="item in cardDeviceVersion"
  40. :key="item.value" :label="item.label" :value="item.value"/>
  41. <el-option v-if="addForm.inventoryType === 'OBU'" v-for="item in obuDeviceVersion"
  42. :key="item.value" :label="item.label" :value="item.value"/>
  43. </el-select>
  44. </el-form-item>
  45. <el-form-item label="采购厂商" prop="brand">
  46. <el-select clearable v-model="addForm.brand" placeholder="请选择设备厂商"
  47. :disabled="typeOption === 'view' || typeOption === 'sure'">
  48. <el-option v-if="addForm.inventoryType === 'OBU'" v-for="item in manufacturerList"
  49. :key="item?.value" :label="item.label" :value="item.value"/>
  50. <el-option v-if="addForm.inventoryType === 'CARD'" v-for="item in cardManufacturerList"
  51. :key="item.value" :label="item.label" :value="item.value"/>
  52. </el-select>
  53. </el-form-item>
  54. <el-form-item label="签类型" prop="obuType" v-if="addForm.inventoryType === 'OBU'">
  55. <el-select clearable v-model="addForm.obuType" placeholder="请选择签类型"
  56. :disabled="typeOption === 'view' || typeOption === 'sure'">
  57. <el-option v-for="item in obuType" :key="item.value" :label="item.label"
  58. :value="item.value"/>
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item label="卡种" prop="cardType" v-if="addForm.inventoryType === 'CARD'">
  62. <el-select clearable v-model="addForm.cardType" placeholder="请选择卡类型"
  63. :disabled="typeOption === 'view' || typeOption === 'sure'">
  64. <el-option v-for="item in cardType" :key="item.value" :label="item.label"
  65. :value="item.value"/>
  66. </el-select>
  67. </el-form-item>
  68. </div>
  69. </el-card>
  70. <el-card class="box-card">
  71. <template #header>
  72. <div class="card-header">
  73. <span>设备明细</span>
  74. <el-upload style="display: inline-block; margin-left: 20px" ref="upload"
  75. v-if="typeOption === 'add' || typeOption === 'edit'" :on-exceed="handleExceed"
  76. :before-upload="beforeAvatarUpload" :data="data" :action="uploadUrl"
  77. @success="onSuccess($event)" accept=".xlsx" :limit="1" :multiple="false"
  78. :show-file-list="false">
  79. <el-button type="primary">导入备货号段</el-button>
  80. </el-upload>
  81. <el-button v-if="typeOption === 'add' || typeOption === 'edit'"
  82. style="display: inline-block; margin-left: 20px" type="primary"
  83. @click="templateDownload">下载模板
  84. </el-button>
  85. </div>
  86. </template>
  87. <div>
  88. <el-table :data="addForm.detailList" :border="true" show-summary :span-method="arraySpanMethod"
  89. :ref="(el) => tableListRef = el" :summary-method="getSummaries">
  90. <el-table-column type="index" header-align="center" align="center" width="60"></el-table-column>
  91. <el-table-column label="起始号段">
  92. <template v-slot="scope">
  93. <div class="input-wrap">
  94. <el-form-item label="" :prop="`startId-${scope.$index}-${scope.row.startId}`"
  95. label-width="0px" style="width: 100%" :rules="{
  96. validator: validateStartId,
  97. trigger: 'blur',
  98. required: true,
  99. }">
  100. <el-input maxlength="60" v-trim clearable v-model="scope.row.startId"
  101. placeholder="请输入起始号段"
  102. :disabled="typeOption === 'view' || typeOption === 'sure'"
  103. @input="handleApplyCount(scope.row, scope.$index)"/>
  104. </el-form-item>
  105. </div>
  106. </template>
  107. </el-table-column>
  108. <el-table-column label="结束号段">
  109. <template v-slot="scope">
  110. <div class="input-wrap">
  111. <el-form-item label="" :prop="`endId-${scope.$index}-${scope.row.endId}`"
  112. label-width="0px" style="width: 100%" :rules="{
  113. validator: validateEndId,
  114. trigger: 'blur',
  115. required: true,
  116. }">
  117. <el-input maxlength="60" v-trim clearable v-model="scope.row.endId"
  118. placeholder="请输入结束号段"
  119. :disabled="typeOption === 'view' || typeOption === 'sure'"
  120. @input="handleApplyCount(scope.row, scope.$index)"/>
  121. </el-form-item>
  122. </div>
  123. </template>
  124. </el-table-column>
  125. <!-- addForm.deviceType === 'OBU' addForm.obuType === 'SINGLE_CHIP'-->
  126. <!-- <el-table-column label="到期时间" width="200">
  127. <template v-slot="scope"> -->
  128. <!-- <el-select clearable v-model="scope.row.warranty" style="width: 100%" placeholder="请选择设备质保期"
  129. :disabled="typeOption === 'view' || typeOption === 'sure'">
  130. <el-option v-for="item in warrantyList" :key="item.value" :label="item.label"
  131. :value="item.value" />
  132. </el-select> -->
  133. <!-- <el-date-picker unlink-panels v-model="scope.row.warranty" type="date"
  134. placeholder="请选择到期时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
  135. style="width: 100%" /> -->
  136. <!-- </template>
  137. </el-table-column> -->
  138. <el-table-column label="操作" width="340" v-if="typeOption === 'add' || typeOption === 'edit'">
  139. <template v-slot="scope">
  140. <el-button class="op-btn" type="primary"
  141. @click="validHandle(scope.row, scope.$index)">校验
  142. </el-button>
  143. <el-button class="op-btn" type="danger" v-if="scope.$index > 0"
  144. @click="deleteHandle(scope.row, scope.$index)">删除
  145. </el-button>
  146. <el-button class="op-btn" type="success"
  147. v-if="scope.$index === (addForm.detailList.length - 1)"
  148. @click="addMoreHandle(scope.row)">继续添加
  149. </el-button>
  150. </template>
  151. </el-table-column>
  152. </el-table>
  153. </div>
  154. </el-card>
  155. </el-form>
  156. <div class="btn-wrap">
  157. <el-button type="primary" @click="backHandle">关闭</el-button>
  158. <el-button type="primary" v-if="typeOption === 'add' || typeOption === 'edit'" @click="saveHandle"
  159. v-loading="btnLoding">备货保存
  160. </el-button>
  161. <el-button type="primary" v-if="typeOption === 'sure'" @click="sureHandle"
  162. v-loading="btnLoding">确认入库
  163. </el-button>
  164. </div>
  165. </div>
  166. </template>
  167. <script setup lang='ts'>
  168. import {reactive, ref, toRaw, getCurrentInstance, onMounted, toRefs, nextTick, computed} from 'vue'
  169. import {ElNotification, ElMessage, UploadInstance, UploadProps, UploadRawFile, genFileId} from "element-plus";
  170. import {IObject} from "@/types/interface";
  171. import {useDebounce, getDictLabel, isNumber, treeDataTranslate, bigNumSub, bigNumAdd} from "@/utils/utils";
  172. import {cloneDeep} from "lodash"
  173. import BaseService from "@/utils/baseService";
  174. import {
  175. getInfoApi,
  176. sureApi,
  177. checkNumApi,
  178. checkNumDetailApi,
  179. addApi,
  180. updateApi,
  181. lowerListApi,
  182. agencyApi,
  183. importReturnApi
  184. } from "@/api/inventoryControl/putInstorage";
  185. import $storeinitData from "@/store/initData"; //引入tab vuex
  186. // 声明事件
  187. const emit = defineEmits([
  188. "closeHandle",
  189. "refreshDataList"
  190. ])
  191. const handleChange = (value) => {
  192. }
  193. const uploadUrl = "/minIo/upload"
  194. const data = {bucket: ""};
  195. const upload = ref<UploadInstance>()
  196. const dataFormRef = ref();
  197. const tableListRef = ref();
  198. const formLoding = ref(false);
  199. const active = ref(1);
  200. const typeOption = ref(""); // 是新增还是修改
  201. const dateValue = ref();
  202. const initForm = {
  203. id: "",
  204. storeId: "",
  205. inventoryType: "",
  206. version: "",
  207. applyId: "",
  208. brand: "",
  209. detailList: [
  210. {
  211. startId: "",
  212. endId: "",
  213. // warranty: "",
  214. count: 0,
  215. isShowBtn: false,
  216. failTotal: 0,
  217. successTotal: 0,
  218. total: 0
  219. }
  220. ]
  221. }
  222. const templateDownload = () => {
  223. let url = import.meta.env.VITE_APP_UPLOAD_URL + 'zhywpt-issuer/template/invw/设备备货号段导入模板.xlsx';
  224. console.log(url, 'bizContent.exportExcelUrlbizContent.exportExcelUrl')
  225. BaseService.getDownload(url, '设备备货号段导入模板')
  226. }
  227. const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
  228. // if (rawFile.type !== 'application/vnd.android.package-archive') {
  229. // ElMessage.error('请上传正确的应用文件')
  230. // return false
  231. // } else if (rawFile.size / 1024 / 1024 > 200) {
  232. // ElMessage.error('文件大小不能超过 200MB!')
  233. // return false
  234. // }
  235. return true
  236. }
  237. const state = reactive({
  238. btnLoding: false,
  239. addForm: cloneDeep(initForm),
  240. warrantyList: [] as IObject[],
  241. allList: [] as IObject[],
  242. treeData: [] as IObject[],
  243. summary: false
  244. })
  245. const interfaceLowerListArr = ref([]);
  246. const interfaceAgencyArr = ref([]);
  247. const deviceTypeList = computed(() => {
  248. // return $storeinitData.state.dictData['DEVICE_TYPE'] || [];
  249. return $storeinitData.state.dictData['INVENTORY_TYPE'] || [];
  250. })
  251. const OWN_TYPE = computed(() => {
  252. return $storeinitData.state.dictData['OWN_TYPE'] || [];
  253. })
  254. const cardDeviceVersion = computed(() => {
  255. return $storeinitData.state.dictData['DEVICE_VERSION'] || [];
  256. })
  257. const obuDeviceVersion = computed(() => {
  258. return $storeinitData.state.dictData['DEVICE_VERSION'] || [];
  259. // return $storeinitData.state.dictData['DEVICE_VERSION_OBU'] || [];
  260. })
  261. const deviceModelList = computed(() => {
  262. return $storeinitData.state.dictData['UNIT_TYPE'] || [];
  263. })
  264. const manufacturerList = computed(() => {
  265. // return $storeinitData.state.dictData['EQUIPMENT_MANUFACTURER_TYPE'] || [];
  266. return $storeinitData.state.dictData['OBU_BRAND'] || [];
  267. })
  268. const cardManufacturerList = computed(() => {
  269. // return $storeinitData.state.dictData['CARD_EQUIPMENT_MANUFACTURER_TYPE'] || [];
  270. return $storeinitData.state.dictData['CARD_BRAND'] || [];
  271. })
  272. const cardType = computed(() => {
  273. return $storeinitData.state.dictData['CARD_TYPE'] || [];
  274. })
  275. const obuType = computed(() => {
  276. return $storeinitData.state.dictData['OBU_TYPE'] || [];
  277. })
  278. const {addForm, warrantyList, allList, treeData, btnLoding, summary}: any = toRefs(state)
  279. const rules = reactive({
  280. storeCode: [{required: true, message: "请选择入库仓库", trigger: "blur"}],
  281. ownType: [{required: true, message: "请选择产权", trigger: "blur"}],
  282. version: [{required: true, message: "请选择设备型号", trigger: "blur"}],
  283. inventoryType: [{required: true, message: "请选择设备类型", trigger: "blur"}],
  284. brand: [{required: true, message: "请选择设备厂商", trigger: "blur"}],
  285. })
  286. const props2 = {
  287. value: "code",
  288. label: "name",
  289. children: "subordinateModel",
  290. // multiple: true,
  291. checkStrictly: true,
  292. }
  293. const handleExceed: UploadProps['onExceed'] = (files) => {
  294. upload.value!.clearFiles()
  295. const file = files[0] as UploadRawFile
  296. file.uid = genFileId()
  297. upload.value!.handleStart(file)
  298. upload.value!.submit()
  299. }
  300. function changeDeviceType() {
  301. addForm.value.version = ''
  302. addForm.value.brand = ''
  303. }
  304. // 初始化
  305. function init(row: any) {
  306. getLowerList();
  307. // getAgency();
  308. clearData();
  309. warrantyList.value = [
  310. {
  311. label: "一年质保期",
  312. value: "1年"
  313. },
  314. {
  315. label: "两年质保期",
  316. value: "2年"
  317. },
  318. {
  319. label: "三年质保期",
  320. value: "3年"
  321. },
  322. {
  323. label: "四年质保期",
  324. value: "4年"
  325. },
  326. {
  327. label: "五年质保期",
  328. value: "5年"
  329. }
  330. ]
  331. if (row && row.id) {
  332. getInfo(row.id)
  333. }
  334. }
  335. // 获取详情
  336. function getInfo(id: string) {
  337. formLoding.value = true;
  338. ///invw/inventory/inventorydetailbyid
  339. BaseService.postN('/invw/api/enterApply/view', {id: id}).then((res: any) => {
  340. if (res && res.code === 0) {
  341. let bizContent = res.data
  342. let data = bizContent.enterApply || {};
  343. let detailList = bizContent.applyDetailsList || [];
  344. let list: any = [];
  345. detailList.map((item) => {
  346. let start = item.startId.slice(3);
  347. let end = item.endId.slice(3);
  348. let num = parseInt(end) - parseInt(start) + 1;
  349. list.push(
  350. {
  351. ...item,
  352. count: num,
  353. isShowBtn: true,
  354. failTotal: 0,
  355. successTotal: 0,
  356. total: 0
  357. }
  358. )
  359. })
  360. addForm.value = {
  361. ...data,
  362. detailList: list
  363. }
  364. //addForm.value.detailList = list;
  365. formLoding.value = false;
  366. } else {
  367. formLoding.value = false;
  368. ElMessage.error(res.message)
  369. }
  370. })
  371. }
  372. function onSuccess(response: any) {
  373. console.log(response)
  374. BaseService.postN('/invw/api/enterApply/parseExcel', {excelUrl: response.data.ossFilePath}).then((res: any) => {
  375. if (res && res.code === 0) {
  376. let bizContent = res.data;
  377. // console.log(bizContent)
  378. let info = bizContent.modelList || "";
  379. let data = bizContent.modelList
  380. let newarr: any = []
  381. data.forEach((column, index) => {
  382. return newarr.push(
  383. {
  384. startId: column.startId,
  385. endId: column.endId,
  386. count: column.endId - column.startId,
  387. isShowBtn: false
  388. }
  389. );
  390. })
  391. addForm.value.detailList = newarr;
  392. //进行排序
  393. startIdSort();
  394. ElMessage.success(res.message)
  395. } else {
  396. ElMessage.error(res.message)
  397. }
  398. })
  399. }
  400. //号段排序,空格排到最后
  401. function startIdSort() {
  402. addForm.value.detailList = addForm.value.detailList.sort((a, b) => {
  403. const isAEmpty = a.startId === "" || a.startId === undefined || a.startId === null;
  404. const isBEmpty = b.startId === "" || b.startId === undefined || b.startId === null;
  405. if (isAEmpty && !isBEmpty) return 1; // a是空,b不是,a排在后面
  406. if (!isAEmpty && isBEmpty) return -1; // a不是空,b是空,a排在前面
  407. return a.startId - b.startId; // 正常比较startId
  408. });
  409. }
  410. // 初始化还原数据
  411. function clearData() {
  412. addForm.value = cloneDeep(initForm);
  413. allList.value = [];
  414. treeData.value = [];
  415. }
  416. function backHandle() {
  417. clearData();
  418. emit("closeHandle");
  419. }
  420. function validHandle(row: IObject, index) {
  421. dataFormRef.value.validate((valid) => {
  422. if (!valid) {
  423. return false;
  424. }
  425. let params: any = {
  426. startId: row.startId,
  427. endId: row.endId,
  428. cardType: addForm.value.cardType,
  429. obuType: addForm.value.obuType,
  430. inventoryType: addForm.value.inventoryType,
  431. }
  432. if (row.id) {
  433. params.detailId = row.id;
  434. }
  435. ///invw/inventory/checkinventorysegment
  436. BaseService.postN('/invw/api/enterApply/codeValid', params).then((res: any) => {
  437. if (res && res.code === 0) {
  438. // let bizContent = res.data
  439. // let data = {
  440. // failTotal: bizContent.failTotal,
  441. // successTotal: bizContent.successTotal,
  442. // total: bizContent.total,
  443. // }
  444. // summary.value = true;
  445. // addForm.value.detailList[index] = {
  446. // ...addForm.value.detailList[index],
  447. // isShowBtn: true,
  448. // failTotal: bizContent.failTotal,
  449. // successTotal: bizContent.successTotal,
  450. // total: bizContent.total,
  451. // }
  452. // let msg = `${bizContent.info}, 总数:${bizContent.total},成功:${bizContent.successTotal},失败:${bizContent.failTotal}`
  453. ElMessage.success(res.message);
  454. } else {
  455. addForm.value.detailList[index].isShowBtn = true;
  456. ElMessage.error(res.message)
  457. }
  458. })
  459. })
  460. }
  461. function validDetailHandle(row: IObject) {
  462. let params: any = {
  463. startId: row.startId,
  464. endId: row.endId
  465. }
  466. if (row.applyId) {
  467. params.applyId = row.applyId;
  468. }
  469. if (row.id) {
  470. params.detailId = row.id;
  471. }
  472. BaseService.postN('/invw/inventory/checkinventorysegmentdetail', params).then((res: any) => {
  473. if (res && res.code === 0) {
  474. let bizContent = res.data
  475. let url = bizContent.url || "";
  476. let fileName = bizContent.fileName ? `${bizContent.fileName}` : '校验结果明细'
  477. if (url) {
  478. // window.open(import.meta.env.VITE_APP_UPLOAD_URL+url);
  479. BaseService.getDownload(import.meta.env.VITE_APP_UPLOAD_URL + url, fileName);
  480. } else {
  481. ElMessage.error("未返回文件地址");
  482. }
  483. } else {
  484. ElMessage.error(res.message)
  485. }
  486. })
  487. }
  488. function deleteHandle(row: IObject, index: number) {
  489. let list = [...addForm.value.detailList];
  490. list.splice(index, 1);
  491. addForm.value.detailList = list;
  492. }
  493. // 继续添加
  494. function addMoreHandle(row: IObject) {
  495. addForm.value.detailList.push({
  496. startId: "",
  497. endId: "",
  498. // warranty: "",
  499. count: 0,
  500. isShowBtn: false,
  501. failTotal: 0,
  502. successTotal: 0,
  503. total: 0
  504. });
  505. }
  506. // 校验起始编号
  507. function validateStartId(
  508. rule: any,
  509. value: string,
  510. callback: (e?: Error) => any
  511. ) {
  512. let inventoryType = addForm.value.inventoryType;
  513. let indexArr = rule.field.split("-");
  514. let index = indexArr[1];
  515. let val = indexArr[2];
  516. if (!isNumber(val)) {
  517. return callback(new Error("必须是数字!"));
  518. }
  519. let length = val.length;
  520. //长度校验
  521. if (inventoryType === "CARD" && length !== 20) {
  522. return callback(new Error("卡编号位数是20!"));
  523. } else if (inventoryType === "OBU" && length !== 16) {
  524. return callback(new Error("OBU编号位数是16!"));
  525. }
  526. //进行排序
  527. startIdSort();
  528. // 开始编号不能大于结束编号校验
  529. if (
  530. val &&
  531. addForm.value.detailList[index].endId &&
  532. BigInt(val) > BigInt(addForm.value.detailList[index].endId)
  533. ) {
  534. return callback(new Error("开始编号不能大于结束编号"));
  535. }
  536. if (
  537. val && index>0 &&
  538. addForm.value.detailList[index-1].endId &&
  539. BigInt(val) <= BigInt(addForm.value.detailList[index-1].endId)
  540. ) {
  541. return callback(new Error("开始编号要大于上一段的结束编号"));
  542. }
  543. callback();
  544. }
  545. // 校验结束编号
  546. //编号规则。设备类型是卡的话,位数是20位 设备类型是OBU的话,位数的16位
  547. function validateEndId(rule: any, value: string, callback: (e?: Error) => any) {
  548. let inventoryType = addForm.value.inventoryType;
  549. let indexArr = rule.field.split("-");
  550. let index = indexArr[1];
  551. let val = indexArr[2];
  552. if (!isNumber(val)) {
  553. return callback(new Error("必须是数字!"));
  554. }
  555. let length = val.length;
  556. if (inventoryType === "CARD" && length !== 20) {
  557. return callback(new Error("卡编号位数是20!"));
  558. } else if (inventoryType === "OBU" && length !== 16) {
  559. return callback(new Error("OBU编号位数是16!"));
  560. }
  561. if (
  562. val &&
  563. addForm.value.detailList[index].startId &&
  564. BigInt(val) < (addForm.value.detailList[index].startId)
  565. ) {
  566. return callback(new Error("结束编号不能小于开始编号"));
  567. }
  568. callback();
  569. }
  570. // 导出
  571. function exportHandle(list: IObject[]) {
  572. let header: string[] = [
  573. "序号",
  574. "申请单编号",
  575. "起始编号",
  576. "结束编号",
  577. "入库结果",
  578. "失败原因",
  579. "重复编号列表",
  580. ];
  581. const resultString = {
  582. ALL_SUCCESS: "全部成功",
  583. PART_SUCESS: "部分成功",
  584. ALL_FAIL: "全部失败"
  585. }
  586. let data: any = [];
  587. let countMony = 0;
  588. let num = 0;
  589. list.map((item, index) => {
  590. let value: any = [];
  591. value.push(index + 1);
  592. value.push(item.applyId);
  593. value.push(item.startId);
  594. value.push(item.endId);
  595. value.push(item.result ? resultString[item.result] : '');
  596. value.push(item.failReason);
  597. value.push(item.duplicatedIds);
  598. data.push(value);
  599. });
  600. import("@/utils/Export2Excel").then((excel) => {
  601. //保存excel
  602. excel.export_json_to_excel({
  603. header: header,
  604. data,
  605. //导出的文件名
  606. filename: "入库结果",
  607. });
  608. });
  609. btnLoding.value = false;
  610. }
  611. // 备货保存
  612. function saveHandle() {
  613. btnLoding.value = true;
  614. if (typeOption.value === "add") {
  615. if (addForm.value.storeCode !== undefined && addForm.value.storeCode !== null && addForm.value.storeCode.length !== 0) {
  616. addForm.value.storeCode = addForm.value.storeCode[addForm.value.storeCode.length - 1]
  617. }
  618. }
  619. dataFormRef.value.validate((valid) => {
  620. if (!valid) {
  621. btnLoding.value = false;
  622. return false;
  623. }
  624. let params: any = {
  625. ...addForm.value
  626. }
  627. let list: any = [];
  628. // 过滤掉仅前端展示的参数和计算的参数。再提交
  629. const keys = ["isShowBtn", "failTotal", "total", "successTotal", "count"]
  630. params.detailList.map((item) => {
  631. let tem = {};
  632. for (let key in item) {
  633. if (keys.indexOf(key) < 0) {
  634. tem[key] = item[key]
  635. }
  636. }
  637. list.push(tem);
  638. })
  639. let params2 = {}
  640. params2.enterApplyDetailModels = list;
  641. params2.brand = params.brand;
  642. params2.inventoryType = params.inventoryType;
  643. params2.ownType = params.ownType;
  644. params2.storeCode = params.storeCode;
  645. params2.agencyId = interfaceLowerListArr.value.find(item => item.code === params.storeCode).agencyId;
  646. params2.version = params.version;
  647. params2.cardType = params.cardType;
  648. params2.obuType = params.obuType;
  649. // let api = '/invw/inventory/addinventoryapply';
  650. let api = '/invw/api/enterApply/apply';
  651. if (typeOption.value === 'add') {
  652. delete params2.id
  653. }
  654. if (typeOption.value === 'edit') {
  655. params2.id = params.id
  656. api = '/invw/api/enterApply/update';
  657. }
  658. BaseService.postN(api, params2).then((res: any) => {
  659. if (res && res.code === 0) {
  660. btnLoding.value = false;
  661. clearData();
  662. emit("refreshDataList");
  663. emit("closeHandle");
  664. ElMessage.success("备货保存成功");
  665. } else {
  666. btnLoding.value = false;
  667. ElMessage.error(res.message);
  668. }
  669. })
  670. })
  671. }
  672. // 确认入库
  673. function sureHandle() {
  674. btnLoding.value = true;
  675. if (addForm.value.id) {
  676. let params = {
  677. id: addForm.value.id
  678. }
  679. ///invw/inventory/inventoryinstorage
  680. BaseService.postN('/invw/api/enterApply/confirm', params).then((res: any) => {
  681. if (res && res.code === 0) {
  682. // let bizContent = res.data
  683. // let url = bizContent.url || "";
  684. // let fileName = bizContent.fileName ? `${bizContent.fileName}` : '初始设备入库明细'
  685. // if (url) {
  686. // //window.open(url)
  687. // //处理下载有文件名
  688. // BaseService.getDownloadFileName(import.meta.env.VITE_APP_UPLOAD_URL + url, fileName)
  689. // btnLoding.value = false;
  690. // clearData();
  691. // emit("refreshDataList");
  692. // emit("closeHandle");
  693. // ElMessage.success("确认入库成功");
  694. // } else {
  695. // ElMessage.error("入库成功文件未返回");
  696. // }
  697. btnLoding.value = false;
  698. clearData();
  699. emit("refreshDataList");
  700. emit("closeHandle");
  701. ElMessage.success(res.message);
  702. } else {
  703. btnLoding.value = false;
  704. ElMessage.error(res.message);
  705. }
  706. })
  707. }
  708. }
  709. // 计算conut
  710. function handleApplyCount(row: IObject, index) {
  711. let startId = row.startId;
  712. let endId = row.endId;
  713. let inventoryType = addForm.value.inventoryType;
  714. let num = 0;
  715. if (inventoryType === 'CARD' && startId && endId) {
  716. // let start = startId.toString().slice(3);
  717. // let end = endId.toString().slice(3);
  718. // num = parseInt(end) - parseInt(start) + 1;
  719. let start: any = startId.toString().slice(3);
  720. let end: any = endId.toString().slice(3);
  721. let tem = bigNumSub(end, start);
  722. num = bigNumAdd(tem, '1');
  723. } else if (inventoryType === 'OBU' && startId && endId) {
  724. //num = parseInt(endId) - parseInt(startId) + 1;
  725. let tem = bigNumSub(endId, startId);
  726. num = bigNumAdd(tem, '1');
  727. }
  728. //解决合计刷新
  729. let receiveVoValue = cloneDeep(addForm.value.detailList);
  730. receiveVoValue[index].count = num;
  731. addForm.value.detailList = receiveVoValue;
  732. }
  733. // 合并合计行
  734. function arraySpanMethod({row, column, rowIndex, columnIndex}) {
  735. //table合计行合并单元格
  736. nextTick(() => {
  737. if (tableListRef.value.$el) {
  738. let current = tableListRef.value.$el
  739. .querySelector('.el-table__footer-wrapper')
  740. .querySelector('.el-table__footer')
  741. let cell = current.rows[0].cells
  742. cell[1].colSpan = '4'
  743. }
  744. })
  745. }
  746. // 合计行计算
  747. function getSummaries(param) {
  748. //table自定义合计行方法summary-method
  749. const {columns, data} = param;
  750. const sums: any = [];
  751. columns.forEach((column, index) => {
  752. if (index === 0) {
  753. sums[index] = '合计';
  754. return
  755. }
  756. if (index === 2) {
  757. const values = data.map((item) => Number(item.count));
  758. sums[1] = values.reduce((prev, curr) => {
  759. return prev + curr
  760. }, 0)
  761. sums[1] = sums[1]
  762. }
  763. })
  764. // let str = "";
  765. // if (sums[1]) {
  766. // str = `共${data.length}号段,${sums[1]}个设备`;
  767. // if (summary.value) {
  768. // console.log(data, '-----');
  769. // const successTotal = data.map((item) => Number(item.successTotal));
  770. // console.log(successTotal.value);
  771. // console.log(4535);
  772. // let totalNum = sums[1] = successTotal.reduce((prev, curr) => {
  773. // return prev + curr
  774. // }, 0)
  775. // str = str + '已校验可入库数量' + totalNum
  776. // }
  777. // }
  778. sums[1] = `共${data.length}号段,${sums[1]}个设备`;
  779. return sums
  780. }
  781. // 获取仓库状态
  782. function getLowerList() {
  783. let params = {
  784. allType: 0
  785. }
  786. BaseService.postN('/invw/api/warehouse/getWarehouseIdNames', params).then((res: any) => {
  787. // console.log(res)
  788. if (res && res.code === 0) {
  789. let bizContent = res.data
  790. // console.log(bizContent)
  791. let data = bizContent.idNames || [];
  792. interfaceLowerListArr.value = data
  793. } else {
  794. ElMessage.error(res.message)
  795. }
  796. })
  797. }
  798. // 获取仓库状态
  799. function getAgency() {
  800. BaseService.postN('/invw/agency/list').then((res: any) => {
  801. if (res && res.code === 0) {
  802. let bizContent = res.data
  803. // console.log(bizContent)
  804. let data = bizContent.idNames || [];
  805. let agencyList: any = [];
  806. data.map((item) => {
  807. // console.log(item)
  808. agencyList.push({
  809. label: item.agencyName,
  810. value: item.ownType
  811. })
  812. })
  813. interfaceAgencyArr.value = agencyList
  814. } else {
  815. ElMessage.error(res.message)
  816. }
  817. })
  818. }
  819. defineExpose({
  820. init,
  821. addForm,
  822. typeOption,
  823. clearData
  824. })
  825. </script>
  826. <style lang='scss' scoped>
  827. .btn-wrap {
  828. display: flex;
  829. justify-content: center;
  830. }
  831. .box-card {
  832. margin-bottom: 16px;
  833. }
  834. .op-btn {
  835. padding: 8px;
  836. }
  837. .input-wrap {
  838. display: flex;
  839. .el-form-item {
  840. margin-bottom: 0;
  841. }
  842. }
  843. .btn-read {
  844. margin-left: 10px;
  845. }
  846. </style>