index.html 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <!-- import CSS -->
  6. <link rel="stylesheet" href="../../css/index.css">
  7. <!-- import Vue before Element -->
  8. <script src="../../js/vue.js"></script>
  9. <!-- import JavaScript -->
  10. <script src="../../js/index.js"></script>
  11. <script src="../../js/axios.js"></script>
  12. </head>
  13. <body>
  14. <div id="app" v-cloak>
  15. <div style="padding: 20px;">
  16. <div>
  17. <div class="commonCss">
  18. <el-form :inline="true" :model="formInline" class="demo-form-inline">
  19. <el-form-item label="盘点计划名称">
  20. <el-input v-model="formInline.planName" placeholder="入库单号"></el-input>
  21. </el-form-item>
  22. <el-form-item>
  23. <el-button type="primary" @click="queryClick()">查询</el-button>
  24. </el-form-item>
  25. </el-form>
  26. </div>
  27. <el-row class="filter-container" style="margin-bottom:10px">
  28. <el-col>
  29. <el-button type="primary" icon="el-icon-plus" size="medium" v-has-permission="['goodsShelves:add']" @click="add()">新增</el-button>
  30. </el-col>
  31. </el-row>
  32. <el-table ref="singleTable" :data="migrationResultList" v-loading="loading" :border=true
  33. tooltip-effect="dark"
  34. highlight-current-row max-height="500" style="width: 100%;overflow-x: auto;"
  35. :default-sort="{prop: 'createDate', order: 'descending'}">
  36. <el-table-column prop="planName" label="盘点计划名称" :show-overflow-tooltip="true" fixed="left"></el-table-column>
  37. <el-table-column prop="planCode" label="盘点计划编码" :show-overflow-tooltip="true"></el-table-column>
  38. <el-table-column prop="planType" label="盘点类型" :show-overflow-tooltip="true">
  39. <template slot-scope="{ row }">
  40. <el-tag >
  41. {{ getInOutTypeText(row.planType) }}
  42. </el-tag>
  43. </template>
  44. </el-table-column>
  45. <el-table-column prop="planStrategy" label="盘点策略" :show-overflow-tooltip="true">
  46. <template slot-scope="{ row }">
  47. <el-tag >
  48. {{ getDetailTypeText(row.planStrategy) }}
  49. </el-tag>
  50. </template>
  51. </el-table-column>
  52. <el-table-column prop="status" label="是否启用" :show-overflow-tooltip="true">
  53. <template slot-scope="{ row }">
  54. <el-tag >
  55. {{ getTypeText(row.status) }}
  56. </el-tag>
  57. </template>
  58. </el-table-column>
  59. <el-table-column prop="planInput" label="盘点数据" :show-overflow-tooltip="true"></el-table-column>
  60. <el-table-column prop="remarks" label="备注" :show-overflow-tooltip="true"></el-table-column>
  61. <el-table-column label="操作" :show-overflow-tooltip="true" fixed="right" width="450px">
  62. <template #default="scope">
  63. <!-- 这里放置操作按钮 -->
  64. <div class="button-group">
  65. <el-button type="primary" @click="edit(scope.row,'edit')" icon="el-icon-edit" >编辑</el-button>
  66. <!--
  67. <el-button type="primary" @click="view(scope.row)" icon="el-icon-edit" >查看</el-button>
  68. -->
  69. <el-button type="danger" @click="orderDelete(scope.row)" icon="el-icon-delete" >删除</el-button>
  70. <el-button type="primary" @click="updateStatus(scope.row)" icon="el-icon-check">{{ scope.row.status === 1 ? '关闭' : '启用' }}</el-button>
  71. <el-button type="primary" @click="savePlanTask(scope.row)" icon="el-icon-check" >执行</el-button>
  72. </div>
  73. </template>
  74. </el-table-column>
  75. </el-table>
  76. <div class="pagination-block">
  77. <el-pagination :current-page="currentPage" :page-sizes="pageSizes" :total="total"
  78. :page-size="currentPageSize"
  79. layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange"
  80. @current-change="handleCurrentChange"/>
  81. </div>
  82. <el-dialog
  83. title="新增盘点计划"
  84. :visible.sync="dialogVisible"
  85. :before-close="handleClose">
  86. <el-form ref="form" :model="plan" :rules="rules" label-position="right" label-width="80px" size="medium">
  87. <!-- 刀具规格 -->
  88. <el-form-item label="盘点名称" prop="planName" >
  89. <el-input v-model.trim="plan.planName" :disabled="isViewMode"></el-input>
  90. </el-form-item>
  91. <el-form-item label="盘点类型" prop="planType">
  92. <el-select v-model="plan.planType" placeholder="请选择" :disabled="isViewMode" @change="handlePlanTypeChange">
  93. <el-option
  94. v-for="item in planTypeOptions"
  95. :key="item.value"
  96. :label="item.label"
  97. :value="item.value">
  98. </el-option>
  99. </el-select>
  100. </el-form-item>
  101. <el-form-item label="盘点策略" prop="planStrategy">
  102. <el-select v-model="plan.planStrategy" placeholder="请选择" :disabled="isViewMode">
  103. <el-option
  104. v-for="item in planStrategyOptions"
  105. :key="item.value"
  106. :label="item.label"
  107. :value="item.value">
  108. </el-option>
  109. </el-select>
  110. </el-form-item>
  111. <el-form-item label="盘点时间" prop="planTime">
  112. <el-date-picker
  113. v-model="plan.planTime"
  114. type="datetime"
  115. placeholder="盘点时间" :disabled="isViewMode">
  116. </el-date-picker>
  117. </el-form-item>
  118. <el-form-item label="物料编码" prop="planInput" v-if="!materialDisabled">
  119. <el-input type="text" v-model="plan.planInput" placeholder="物料编码" style="width: 300px"></el-input>
  120. </el-form-item>
  121. <el-form-item label="库位编码" prop="planInput" v-if="!storageDisabled">
  122. <el-input type="text" v-model="plan.planInput" placeholder="库位编码" style="width: 300px" ></el-input>
  123. </el-form-item>
  124. <el-form-item label="货架" prop="planStrategy" v-if="!shelfDisabled">
  125. <el-select v-model="plan.planInput" placeholder="请选择">
  126. <el-option
  127. v-for="item in shlefOptions"
  128. :key="item.shelfCode"
  129. :label="item.shelfName"
  130. :value="item.shelfCode">
  131. </el-option>
  132. </el-select>
  133. </el-form-item>
  134. <el-form-item label="库房" prop="planStrategy" v-if="!wareDisabled">
  135. <el-select v-model="plan.planInput" placeholder="请选择">
  136. <el-option
  137. v-for="item in warehouseOptions"
  138. :key="item.warehouseCode"
  139. :label="item.warehouseName"
  140. :value="item.warehouseCode">
  141. </el-option>
  142. </el-select>
  143. </el-form-item>
  144. <!--<el-form-item label="盘点数据" prop="planInput">
  145. <el-input type="text" v-model="plan.planInput" placeholder="" style="width: 300px" :disabled="isViewMode"></el-input>
  146. </el-form-item>-->
  147. <el-form-item label="备注">
  148. <el-input type="text" v-model="plan.remarks" placeholder="" style="width: 300px" :disabled="isViewMode"></el-input>
  149. </el-form-item>
  150. </el-form>
  151. <span slot="footer" class="dialog-footer">
  152. <el-button @click="dialogVisible = false">取 消</el-button>
  153. <el-button type="primary" @click="submit()" :disabled="isViewMode">确 定</el-button>
  154. </span>
  155. </el-dialog>
  156. <el-dialog
  157. title="执行出库"
  158. :visible.sync="dialogVisibleTask"
  159. :before-close="handleCloseTask" width="80%">
  160. <el-form :inline="true" :model="formInline" class="demo-form-inline">
  161. <el-form-item label="入库口">
  162. <el-select v-model="entryPoint" placeholder="请选择">
  163. <el-option
  164. v-for="item in options"
  165. :key="item.value"
  166. :label="item.label"
  167. :value="item.value">
  168. </el-option>
  169. </el-select>
  170. </el-form-item>
  171. <el-form-item>
  172. <el-input type="text" v-model="palletCode" placeholder="托盘编码" style="width: 100px;" :disabled="true"></el-input>
  173. </el-form-item>
  174. <el-form-item>
  175. <el-input type="text" v-model="binCode" placeholder="料箱编码" style="width: 100px;" :disabled="true"></el-input>
  176. </el-form-item>
  177. <el-form-item>
  178. <el-input type="text" v-model="inputCode" placeholder="扫码顺序 托盘 > 物料编码" @change="handleScan()" style="width: 300px" ></el-input>
  179. </el-form-item>
  180. </el-form-item>
  181. <el-form-item>
  182. <el-button type="primary" @click="outSubmit()" :disabled="isViewMode">托盘回库</el-button>
  183. </el-form-item>
  184. </el-form>
  185. <div class="table-container" style="margin-bottom: 80px;margin-top: 20px;">
  186. <div class="table-wrapper">
  187. <div class="table-title">需求明细</div>
  188. <el-table ref="singleTable" :data="detailListTask" v-loading="loading" :border=true label="需求明细"
  189. tooltip-effect="dark"
  190. highlight-current-row max-height="500" style="width: 100%;margin-right:22px"
  191. :default-sort="{prop: 'createDate', order: 'descending'}"
  192. >
  193. <el-table-column prop="materialCode" label="物料编码" :show-overflow-tooltip="true"></el-table-column>
  194. <el-table-column prop="materialName" label="物料名称" :show-overflow-tooltip="true"></el-table-column>
  195. <el-table-column prop="planAmount" label="计划出库数量" :show-overflow-tooltip="true"></el-table-column>
  196. </el-table>
  197. </div>
  198. <div class="table-wrapper">
  199. <div class="table-title">库存明细</div>
  200. <el-table ref="singleTable" :data="detailListTask" v-loading="loading" :border=true label="库存明细"
  201. tooltip-effect="dark"
  202. highlight-current-row max-height="500" style="width: 100%;"
  203. :default-sort="{prop: 'createDate', order: 'descending'}"
  204. ><!--@row-click="rowClick"-->
  205. <el-table-column prop="materialCode" label="物料编码" :show-overflow-tooltip="true"></el-table-column>
  206. <el-table-column prop="storageLocationCode" label="库位编码" :show-overflow-tooltip="true"></el-table-column>
  207. <el-table-column label="托盘" :show-overflow-tooltip="true">
  208. <template #default="{ row }">
  209. <el-select v-model="row.outPalletCode" placeholder="请选择" @change="handleSelectChange(row)">
  210. <el-option
  211. v-for="option in row.inventoryManagementList"
  212. :key="option.storageLocationCode"
  213. :label="option.palletCode"
  214. :value="option.palletCode">
  215. </el-option>
  216. </el-select>
  217. </template>
  218. </el-table-column>
  219. <el-table-column prop="amount" label="库存数量" :show-overflow-tooltip="true"></el-table-column>
  220. <el-table-column label="操作">
  221. <template #default="scope">
  222. <!-- 这里放置操作按钮 -->
  223. <el-button type="primary" @click="getOutPalletCode(scope.row)">出库</el-button>
  224. <!-- 可以添加更多的操作按钮 -->
  225. </template>
  226. </el-table-column>
  227. </el-table>
  228. </div>
  229. </div>
  230. <div class="table-container" >
  231. <div class="table-wrapper">
  232. <div class="table-title">托盘明细</div>
  233. <el-table ref="singleTable" :data="detailListPallet" v-loading="loading" :border=true label="需求明细"
  234. tooltip-effect="dark"
  235. highlight-current-row max-height="500" style="width: 100%;margin-right:22px"
  236. :default-sort="{prop: 'createDate', order: 'descending'}"
  237. >
  238. <el-table-column prop="materialCode" label="物料编码" :show-overflow-tooltip="true"></el-table-column>
  239. <el-table-column prop="materialName" label="物料名称" :show-overflow-tooltip="true"></el-table-column>
  240. <el-table-column prop="amount" label="库存数量" :show-overflow-tooltip="true"></el-table-column>
  241. </el-table>
  242. </div>
  243. <div class="table-wrapper">
  244. <div class="table-title">
  245. <span>出库明细</span>
  246. <!--<el-input type="text" v-model="palletCode" placeholder="托盘编码" :disabled="true" style="width: 100px;margin-left:10px"></el-input>
  247. <el-input type="text" v-model="inputCode" placeholder="扫码顺序 托盘 > 物料编码" @change="handleScan()" style="width: 300px;margin-left:10px" ></el-input>
  248. <el-button type="primary" @click="outSubmit()" :disabled="isViewMode">托盘回库</el-button>-->
  249. </div>
  250. <el-table ref="singleTable" :data="detailListOut" v-loading="loading" :border=true label="库存明细"
  251. tooltip-effect="dark"
  252. highlight-current-row max-height="500" style="width: 100%;"
  253. :default-sort="{prop: 'createDate', order: 'descending'}" @selection-change="handleSelectionChange"
  254. >
  255. <el-table-column
  256. type="selection"
  257. >
  258. </el-table-column>
  259. <el-table-column prop="materialCode" label="物料编码" :show-overflow-tooltip="true"></el-table-column>
  260. <el-table-column prop="materialName" label="物料名称" :show-overflow-tooltip="true"></el-table-column>
  261. <el-table-column prop="amount" label="本次出库数量" :show-overflow-tooltip="true">
  262. <template slot-scope="scope">
  263. <el-input v-model="scope.row.amount" type="number"></el-input>
  264. </template>
  265. </el-table-column>
  266. </el-table>
  267. </div>
  268. </div>
  269. <span slot="footer" class="dialog-footer">
  270. <el-button @click="handleCloseTask()">取 消</el-button>
  271. </span>
  272. </el-dialog>
  273. </div>
  274. </div>
  275. </div>
  276. </body>
  277. <style scoped>
  278. .table-container {
  279. display: flex;
  280. justify-content: space-between;
  281. width: 100%;
  282. }
  283. .table-wrapper {
  284. position: relative;
  285. width: 48%;
  286. }
  287. .table-title {
  288. position: absolute;
  289. top: -25px; /* Adjust based on your layout */
  290. left: 0;
  291. font-weight: bold;
  292. }
  293. </style>
  294. <script type="module">
  295. new Vue({
  296. el: '#app',
  297. data: function () {
  298. return {
  299. migrationResultList: [],
  300. detailList: [],
  301. detailListTask: [],
  302. detailListStore: [],
  303. detailListPallet: [],
  304. detailListOut: [],
  305. planTypeOptions: [],
  306. planStrategyOptions: [],
  307. shlefOptions: [],
  308. warehouseOptions: [],
  309. options:[],
  310. name: '',
  311. createDate: '',
  312. currentPage: 1,
  313. total: 0,
  314. currentPageSize: 10,
  315. pageSizes: [10, 50, 100, 200, 300],
  316. loading: false,
  317. formInline: {
  318. planName: ''
  319. },
  320. detailType:'',
  321. palletCode:'',
  322. dialogVisible:false,
  323. dialogVisibleTask:false,
  324. materialDisabled:true,
  325. storageDisabled:true,
  326. shelfDisabled:true,
  327. wareDisabled:true,
  328. plan: this.initOrder(),
  329. rules: {
  330. planName: [
  331. { required: true, message: '必填', trigger: 'blur' },
  332. ],
  333. planType: [
  334. { required: true, message: '必填', trigger: 'blur' },
  335. ],
  336. planStrategy: [
  337. { required: true, message: '必填', trigger: 'blur' },
  338. ],
  339. planInput: [
  340. { required: true, message: '必填', trigger: 'blur' },
  341. ],
  342. planTime: [
  343. { required: true, message: '必填', trigger: 'blur' },
  344. ],
  345. },
  346. inputCode:'',
  347. entryPoint:'',
  348. binCode:'',
  349. selection: [],
  350. isViewMode:false,
  351. planId:'',
  352. wInventoryTransactionOrdersId:'',
  353. shelfCode:'',
  354. }
  355. },
  356. created() {
  357. console.log("初始化")
  358. this.queryClick();
  359. this.getDic();
  360. },
  361. methods: {
  362. handleSizeChange(pageSize, total) {
  363. this.currentPage = 1;
  364. this.currentPageSize = pageSize;
  365. this.queryClick();
  366. },
  367. initOrder(){
  368. return{
  369. planName:'',
  370. planStrategy:'',
  371. planInput:'',
  372. planTime:'',
  373. remarks:'',
  374. planType:''
  375. }
  376. },
  377. handleCurrentChange(page) {
  378. this.currentPage = page;
  379. this.queryClick();
  380. },
  381. clear() {
  382. this.ylCard = '';
  383. this.master = '';
  384. }, getDic() {
  385. axios.post('/Dic/list', {
  386. 'dicCode': 'planType'
  387. })
  388. .then(response => {
  389. console.log(response)
  390. this.planTypeOptions = response.data;
  391. })
  392. .catch(error => {
  393. // 处理错误
  394. });
  395. axios.post('/Dic/list', {
  396. 'dicCode': 'planStrategy'
  397. })
  398. .then(response => {
  399. console.log(response)
  400. this.planStrategyOptions = response.data;
  401. })
  402. .catch(error => {
  403. // 处理错误
  404. });
  405. axios.get('/wShelfManagement', {
  406. })
  407. .then(response => {
  408. console.log(response)
  409. this.shlefOptions = response.data.data;
  410. })
  411. .catch(error => {
  412. // 处理错误
  413. });
  414. axios.get('/wWarehouseManagement', {
  415. })
  416. .then(response => {
  417. console.log(response)
  418. this.warehouseOptions = response.data.data;
  419. })
  420. .catch(error => {
  421. // 处理错误
  422. });
  423. },
  424. queryClick() {
  425. this.loading = true;
  426. axios.get('/wPInventoryCountPlan', {
  427. params:{
  428. page: this.currentPage,
  429. size: this.currentPageSize,
  430. planName:this.formInline.planName
  431. }
  432. })
  433. .then(response => {
  434. console.log(response)
  435. this.migrationResultList = response.data.list;
  436. this.total = response.data.total;
  437. // 处理响应
  438. this.loading = false;
  439. })
  440. .catch(error => {
  441. // 处理错误
  442. });
  443. }, getTypeText(status) {
  444. switch (status) {
  445. case 0:
  446. return "否"; // 第二种类型的文本
  447. case 1:
  448. return '是'; // 第三种类型的文本
  449. default:
  450. return ""
  451. }
  452. }, getInOutTypeText(status) {
  453. switch (status) {
  454. case 1:
  455. return '物料'; // 第三种类型的文本
  456. case 2:
  457. return '库位'; // 第四种类型的文本
  458. case 3:
  459. return '货架'; // 第四种类型的文本
  460. case 4:
  461. return '库房'; // 第四种类型的文本
  462. default:
  463. return ""
  464. }
  465. }, getDetailTypeText(status) {
  466. switch (status) {
  467. case 7:
  468. return "每周";
  469. case 30:
  470. return "每月";
  471. case 365:
  472. return "每年";
  473. default:
  474. return "";
  475. }
  476. },add(){
  477. this.dialogVisible=true;
  478. this.isViewMode=false;
  479. this.clearForm();
  480. },edit(row,view){
  481. if(view === 'view'){
  482. this.isViewMode=true;
  483. }else{
  484. this.isViewMode=false;
  485. }
  486. this.dialogVisible=true;
  487. axios.get('/wPInventoryCountPlan/'+row.id, {
  488. })
  489. .then(response => {
  490. console.log(response)
  491. if(response.status === 200){
  492. const res=response.data;
  493. this.planId=res.id;
  494. this.plan.planName=res.planName;
  495. this.plan.planCode=res.planCode;
  496. this.plan.planType=res.planType.toString();
  497. this.plan.planStrategy=res.planStrategy.toString();
  498. this.plan.planTime=res.planTime;
  499. this.plan.planInput=res.planInput;
  500. this.plan.remarks=res.remarks;
  501. if(res.planType == 1){
  502. this.materialDisabled=false;
  503. this.storageDisabled=true;
  504. this.shelfDisabled=true;
  505. this.wareDisabled=true;
  506. }else if(res.planType==2){
  507. this.materialDisabled=true;
  508. this.storageDisabled=false;
  509. this.shelfDisabled=true;
  510. this.wareDisabled=true;
  511. }else if(res.planType==3){
  512. this.materialDisabled=true;
  513. this.storageDisabled=true;
  514. this.shelfDisabled=false;
  515. this.wareDisabled=true;
  516. }else if(res.planType==4){
  517. this.materialDisabled=true;
  518. this.storageDisabled=true;
  519. this.shelfDisabled=true;
  520. this.wareDisabled=false;
  521. }
  522. }
  523. })
  524. .catch(error => {
  525. // 处理错误
  526. });
  527. },view(row){
  528. this.edit(row,'view');
  529. },orderDelete(row){
  530. this.$confirm('确认删除?')
  531. .then(_ => {
  532. axios.delete('/wPInventoryCountPlan', {
  533. params:{
  534. id:row.id
  535. }
  536. })
  537. .then(response => {
  538. console.log(response)
  539. if(response.data){
  540. this.$message({
  541. message: '删除成功',
  542. type: "success"
  543. })
  544. this.queryClick();
  545. }
  546. })
  547. .catch(error => {
  548. // 处理错误
  549. });
  550. done();
  551. })
  552. .catch(_ => {});
  553. },updateStatus(row){
  554. this.$confirm('确认开启?')
  555. .then(_ => {
  556. axios.get('/wPInventoryCountPlan/updateStatus/'+row.id, {
  557. })
  558. .then(response => {
  559. console.log(response)
  560. if(response.data){
  561. this.$message({
  562. message: '开启成功或关闭',
  563. type: "success"
  564. })
  565. this.queryClick();
  566. }
  567. })
  568. .catch(error => {
  569. // 处理错误
  570. });
  571. done();
  572. })
  573. .catch(_ => {});
  574. },handleSelectionChange(selection) {
  575. this.selection = selection
  576. },addNewRow() {
  577. // Define your new row object
  578. /*if(this.entryPoint === ''){
  579. this.$message.error('请选择当前入库口');
  580. return
  581. }*/
  582. const code= this.inputCode
  583. //判断输入的是托盘编码 料箱编码 物料编码
  584. axios.get('/wMaterial/'+code, {
  585. })
  586. .then(response => {
  587. console.log(response)
  588. const verify=response.data.data;
  589. if(verify === null){
  590. this.$message.error('无法识别'+code);
  591. this.inputCode='';
  592. return
  593. }
  594. this.verifCode(code,verify);
  595. })
  596. .catch(error => {
  597. // 处理错误
  598. });
  599. },verifCode(code,verify){
  600. //0 物料编码 1 托盘编码 2 料盒编码
  601. const newRow = {
  602. materialCode: code,
  603. materialName: verify.materialName,
  604. planAmount: 1,
  605. };
  606. this.inputCode='';
  607. if(this.detailList.length === 0){
  608. // Push the new row to migrationResultList
  609. this.detailList.push(newRow);
  610. this.addOutPalletCode(code);
  611. }else{
  612. let flag = true;
  613. this.detailList.forEach(item => {
  614. if (item.materialCode === code) {
  615. item.planAmount=parseInt(item.planAmount)+1;
  616. flag=false;
  617. }
  618. });
  619. if(flag){
  620. this.detailList.push(newRow);
  621. this.addOutPalletCode(code);
  622. }
  623. }
  624. },handleClose(done) {
  625. this.clearForm();
  626. this.dialogVisible=false;
  627. done();
  628. /* this.$confirm('确认关闭?')
  629. .then(_ => {
  630. })
  631. .catch(_ => {});*/
  632. },handleDelete(row) {
  633. // 从 migrationResultList 中删除当前行
  634. const index = this.detailList.indexOf(row);
  635. if (index !== -1) {
  636. this.detailList.splice(index, 1);
  637. }
  638. },submit(){
  639. axios.post('/wPInventoryCountPlan', {
  640. "id":this.planId,
  641. "planName":this.plan.planName,
  642. "planCode":this.plan.planCode,
  643. "planType":this.plan.planType,
  644. "planStrategy":this.plan.planStrategy,
  645. "planTime":this.plan.planTime,
  646. "planInput":this.plan.planInput,
  647. "remarks":this.plan.remarks,
  648. "status":0,
  649. "operation":this.planId === ''?"add":"edit"
  650. }).then(response => {
  651. if(response.data.success){
  652. this.$message({
  653. message: this.planId === ''?'保存成功':'修改成功',
  654. type: "success"
  655. })
  656. this.dialogVisible=false;
  657. this.queryClick();
  658. }
  659. })
  660. .catch(error => {
  661. // 处理错误
  662. });
  663. },clearForm(){
  664. this.planId='';
  665. this.plan.planName='';
  666. this.plan.planCode='';
  667. this.plan.planType='';
  668. this.plan.planStrategy='';
  669. this.plan.planTime='';
  670. this.plan.planInput='';
  671. this.plan.remarks='';
  672. },toDo(row){
  673. this.dialogVisibleTask=true;
  674. this.wInventoryTransactionOrdersId=row.id;
  675. axios.get('/order/getOrderById/'+row.id, {
  676. })
  677. .then(response => {
  678. console.log(response)
  679. if(response.data.success){
  680. const res=response.data.data;
  681. }
  682. })
  683. .catch(error => {
  684. // 处理错误
  685. });
  686. },handleCloseTask(){
  687. this.dialogVisibleTask=false;
  688. this.detailListPallet=[];
  689. this.inputCode='';
  690. this.palletCode='';
  691. },handleSelectChange(row){
  692. console.log(row)
  693. row.inventoryManagementList.forEach(item=>{
  694. if(row.outPalletCode === item.palletCode){
  695. row.storageLocationCode=item.storageLocationCode;
  696. row.amount=item.amount;
  697. return
  698. }
  699. })
  700. },
  701. rowClick(row, column, event){
  702. // 处理行点击事件
  703. console.log('Row clicked:', row);
  704. console.log('Column clicked:', column);
  705. console.log('Event:', event);
  706. axios.get('/wInventoryManagement/'+row.storageLocationCode, {
  707. })
  708. .then(response => {
  709. console.log(response)
  710. if(response.data.success){
  711. const res=response.data.data;
  712. this.detailListPallet=res;
  713. }
  714. })
  715. .catch(error => {
  716. // 处理错误
  717. });
  718. },handleScan(){
  719. console.log(this.inputCode)
  720. axios.get('/order/verifyCode/'+this.inputCode, {
  721. })
  722. .then(response => {
  723. const verify=response.data.data;
  724. if(verify === null){
  725. this.$message.error('无法识别'+this.inputCode);
  726. this.inputCode='';
  727. return
  728. }
  729. if(verify === 0){
  730. const needFlag=this.detailListTask.some(vo=>{
  731. if(vo.materialCode === this.inputCode){
  732. return true;
  733. }
  734. return false;
  735. })
  736. if(!needFlag){
  737. this.$message.error('需求明细无法识别'+this.inputCode);
  738. this.inputCode='';
  739. return;
  740. }
  741. const flag =this.detailListPallet.some(vo=>{
  742. if(vo.materialCode === this.inputCode){
  743. const flag1=this.detailListOut.some(item =>{
  744. if(item.materialCode === this.inputCode){
  745. item.amount=parseInt(item.amount)+1;
  746. return true;
  747. }
  748. return false;
  749. })
  750. if(!flag1){
  751. const newRow = {
  752. "materialCode":this.inputCode,
  753. "materialName":vo.materialName,
  754. "amount":1
  755. }
  756. this.detailListOut.push(newRow);
  757. }
  758. return true;
  759. }
  760. return false;
  761. })
  762. if(!flag){
  763. this.$message.error('托盘明细中无法识别'+this.inputCode);
  764. }
  765. }else if(verify === 1){
  766. console.log(this.detailListTask)
  767. const allMaterials = this.detailListTask.reduce((accumulator, currentObject) => {
  768. return accumulator.concat(currentObject.inventoryManagementList);
  769. }, []);
  770. let locationCode1='';
  771. const hasMatchingCode = allMaterials.some(task => {
  772. if (task.palletCode === this.inputCode) {
  773. locationCode1 = task.storageLocationCode;
  774. return true;
  775. }
  776. return false;
  777. });
  778. if(!hasMatchingCode){
  779. this.$message.error("库存明细中无法识别到 " + this.inputCode);
  780. this.inputCode='';
  781. return;
  782. }
  783. axios.get('/wInventoryManagement/'+locationCode1, {
  784. })
  785. .then(response => {
  786. console.log(response)
  787. if(response.data.success){
  788. const res=response.data.data;
  789. this.detailListPallet=res;
  790. }
  791. })
  792. .catch(error => {
  793. // 处理错误
  794. });
  795. this.palletCode=this.inputCode;
  796. }
  797. this.inputCode='';
  798. })
  799. .catch(error => {
  800. // 处理错误
  801. });
  802. },handleSelectionChange(selection) {
  803. this.selection = selection
  804. },outSubmit(){
  805. if (!this.selection.length) {
  806. this.$message({
  807. message: '至少勾选一行数据',
  808. type: "error"
  809. })
  810. return
  811. }
  812. this.selection.forEach(item=>{
  813. if(item.amount === '' || item.amount <= 0){
  814. this.$message({
  815. message: '本次出库数量不能为空或小于等于0',
  816. type: "error"
  817. })
  818. return
  819. }
  820. })
  821. if(this.entryPoint ===''){
  822. this.$message({
  823. message: '入库口不能为空',
  824. type: "error"
  825. })
  826. return
  827. }
  828. axios.post('/wStorageLocationManagement', {
  829. 'startPosition':this.entryPoint,
  830. 'wInventoryTransactionOrdersId':this.wInventoryTransactionOrdersId,
  831. 'vectorCode':this.palletCode,
  832. 'status':0,
  833. 'taskType':2,//代表实际的出入库操作
  834. 'detailList':this.selection
  835. })
  836. .then(response => {
  837. if(response.data.success){
  838. const code=response.data.data;
  839. this.$message({
  840. message: '空托盘 '+code +' 已出库',
  841. type: 'success'
  842. });
  843. }else{
  844. this.$message.error(response.data.data);
  845. }
  846. })
  847. .catch(error => {
  848. // 处理错误
  849. });
  850. },savePlanTask(row){
  851. this.$confirm('确认生成盘点任务吗?')
  852. .then(_ => {
  853. axios.post('/wPInventoryCountTask', {
  854. id:row.id
  855. })
  856. .then(response => {
  857. if(response.data.success){
  858. this.$message({
  859. message: '盘点任务生成成功',
  860. type: 'success'
  861. });
  862. }
  863. })
  864. .catch(error => {
  865. // 处理错误
  866. });
  867. done();
  868. })
  869. .catch(_ => {});
  870. },handlePlanTypeChange(value){
  871. console.log(value);
  872. if(value == 1){
  873. this.materialDisabled=false;
  874. this.storageDisabled=true;
  875. this.shelfDisabled=true;
  876. this.wareDisabled=true;
  877. }else if(value==2){
  878. this.materialDisabled=true;
  879. this.storageDisabled=false;
  880. this.shelfDisabled=true;
  881. this.wareDisabled=true;
  882. }else if(value==3){
  883. this.materialDisabled=true;
  884. this.storageDisabled=true;
  885. this.shelfDisabled=false;
  886. this.wareDisabled=true;
  887. }else if(value==4){
  888. this.materialDisabled=true;
  889. this.storageDisabled=true;
  890. this.shelfDisabled=true;
  891. this.wareDisabled=false;
  892. }
  893. }
  894. }
  895. })
  896. </script>
  897. </html>