order-search.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. <!-- 搜索表单 -->
  2. <template>
  3. <el-form
  4. label-width="90px"
  5. class="ele-form-search"
  6. @keyup.enter.native="search"
  7. @submit.native.prevent
  8. >
  9. <el-row :gutter="15">
  10. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  11. <!-- <el-form-item label="关键字:">-->
  12. <!-- <el-input-->
  13. <!-- v-model="where.keyWord"-->
  14. <!-- size="mini"-->
  15. <!-- placeholder="请输入"-->
  16. <!-- ></el-input>-->
  17. <!-- </el-form-item>-->
  18. <!-- </el-col>-->
  19. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  20. <!-- <el-form-item label="销售订单号:">-->
  21. <!-- <el-input-->
  22. <!-- v-model="where.code"-->
  23. <!-- size="mini"-->
  24. <!-- placeholder="请输入"-->
  25. <!-- ></el-input>-->
  26. <!-- </el-form-item>-->
  27. <!-- </el-col>-->
  28. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  29. <!-- <el-form-item label="产品编码:">-->
  30. <!-- <el-input-->
  31. <!-- v-model="where.productCode"-->
  32. <!-- size="mini"-->
  33. <!-- placeholder="请输入"-->
  34. <!-- ></el-input>-->
  35. <!-- </el-form-item>-->
  36. <!-- </el-col>-->
  37. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  38. <!-- <el-form-item label="行号:">-->
  39. <!-- <el-input-->
  40. <!-- v-model="where.lineNumber"-->
  41. <!-- size="mini"-->
  42. <!-- placeholder="请输入"-->
  43. <!-- ></el-input>-->
  44. <!-- </el-form-item>-->
  45. <!-- </el-col>-->
  46. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  47. <!-- <el-form-item label="牌号:">-->
  48. <!-- <el-input-->
  49. <!-- v-model="where.brandNo"-->
  50. <!-- size="mini"-->
  51. <!-- placeholder="请输入"-->
  52. <!-- ></el-input>-->
  53. <!-- </el-form-item>-->
  54. <!-- </el-col>-->
  55. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  56. <!-- <el-form-item label="型号:">-->
  57. <!-- <el-input-->
  58. <!-- v-model="where.model"-->
  59. <!-- size="mini"-->
  60. <!-- placeholder="请输入"-->
  61. <!-- ></el-input>-->
  62. <!-- </el-form-item>-->
  63. <!-- </el-col>-->
  64. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  65. <!-- <el-form-item label="订单来源:">-->
  66. <!-- <DictSelection-->
  67. <!-- dictName="订单来源"-->
  68. <!-- size="mini"-->
  69. <!-- clearable-->
  70. <!-- v-model="where.orderSource"-->
  71. <!-- >-->
  72. <!-- </DictSelection>-->
  73. <!-- </el-form-item>-->
  74. <!-- </el-col>-->
  75. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  76. <!-- <el-form-item label="客户名称:">-->
  77. <!-- <el-input-->
  78. <!-- v-model="where.customerName"-->
  79. <!-- size="mini"-->
  80. <!-- placeholder="请输入"-->
  81. <!-- ></el-input>-->
  82. <!-- </el-form-item>-->
  83. <!-- </el-col>-->
  84. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  85. <!-- <el-form-item label="订单类型:">-->
  86. <!-- <DictSelection-->
  87. <!-- dictName="订单类型"-->
  88. <!-- clearable-->
  89. <!-- size="mini"-->
  90. <!-- v-model="where.orderType"-->
  91. <!-- >-->
  92. <!-- </DictSelection>-->
  93. <!-- </el-form-item>-->
  94. <!-- </el-col>-->
  95. <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
  96. <el-form-item label="生产状态:">
  97. <el-select
  98. v-model="where.proStu"
  99. placeholder="请选择"
  100. class="w100"
  101. size="mini"
  102. >
  103. <el-option
  104. v-if="activeName == 'first'"
  105. v-for="item in awaitProcuct"
  106. :key="item.value"
  107. :label="item.label"
  108. :value="item.value"
  109. >
  110. </el-option>
  111. <el-option
  112. v-if="activeName == 'second'"
  113. v-for="item in alreadyProcuct"
  114. :key="item.value"
  115. :label="item.label"
  116. :value="item.value"
  117. >
  118. </el-option>
  119. </el-select>
  120. </el-form-item>
  121. </el-col>
  122. <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
  123. <el-form-item label="订单类型:">
  124. <el-select
  125. v-model="where.orderType"
  126. placeholder="请选择"
  127. class="w100"
  128. size="mini"
  129. >
  130. <el-option
  131. v-for="item in orderList"
  132. :key="item.value"
  133. :label="item.label"
  134. :value="item.value"
  135. >
  136. </el-option>
  137. </el-select>
  138. </el-form-item>
  139. </el-col>
  140. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  141. <!-- <el-form-item label="业务员:">-->
  142. <!-- <el-input-->
  143. <!-- v-model="where.salesman"-->
  144. <!-- size="mini"-->
  145. <!-- placeholder="请输入"-->
  146. <!-- ></el-input>-->
  147. <!-- </el-form-item>-->
  148. <!-- </el-col>-->
  149. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
  150. <!-- <el-form-item label="产品名称:">-->
  151. <!-- <el-input-->
  152. <!-- v-model="where.productName"-->
  153. <!-- size="mini"-->
  154. <!-- placeholder="请输入"-->
  155. <!-- ></el-input>-->
  156. <!-- </el-form-item>-->
  157. <!-- </el-col>-->
  158. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  159. <el-form-item label="交货日期:">
  160. <el-date-picker
  161. style="width: 100%"
  162. v-model="time"
  163. type="daterange"
  164. range-separator="至"
  165. start-placeholder="开始日期"
  166. end-placeholder="结束日期"
  167. size="mini"
  168. value-format="yyyy-MM-dd HH:mm:ss"
  169. :default-time="['00:00:00', '23:59:59']"
  170. >
  171. </el-date-picker>
  172. </el-form-item>
  173. </el-col>
  174. <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">-->
  175. <!-- <el-form-item label="组织机构:">-->
  176. <!-- <auth-selection-->
  177. <!-- data-type="Array"-->
  178. <!-- size="mini"-->
  179. <!-- v-model="where.deptIds"-->
  180. <!-- style="width: 100%"-->
  181. <!-- ></auth-selection>-->
  182. <!-- </el-form-item>-->
  183. <!-- </el-col>-->
  184. <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
  185. <el-form-item label-width="0">
  186. <el-input
  187. size="mini"
  188. clearable
  189. v-model="where.searchInfo"
  190. placeholder="请输入查询信息"
  191. />
  192. </el-form-item>
  193. </el-col>
  194. <el-col v-bind="styleResponsive ? { lg: 4, md: 6 } : { span: 4 }">
  195. <div class="ele-form-actions">
  196. <el-dropdown trigger="click">
  197. <span class="el-dropdown-link">
  198. 展开<i class="el-icon-arrow-down el-icon--right"></i>
  199. </span>
  200. <el-dropdown-menu>
  201. <div class="searchExpend">
  202. <el-row>
  203. <el-form-item label="关键字:" label-width="80px">
  204. <el-input
  205. v-model="where.keyWord"
  206. size="mini"
  207. placeholder="请输入"
  208. ></el-input>
  209. </el-form-item>
  210. </el-row>
  211. <el-row>
  212. <el-form-item label="销售订单号:">
  213. <el-input
  214. v-model="where.code"
  215. size="mini"
  216. placeholder="请输入"
  217. ></el-input>
  218. </el-form-item>
  219. </el-row>
  220. <el-row>
  221. <el-form-item label="产品编码:">
  222. <el-input
  223. v-model="where.productCode"
  224. size="mini"
  225. placeholder="请输入"
  226. ></el-input>
  227. </el-form-item>
  228. </el-row>
  229. <el-row>
  230. <el-form-item label="订单来源:">
  231. <DictSelection
  232. dictName="订单来源"
  233. size="mini"
  234. clearable
  235. v-model="where.orderSource"
  236. >
  237. </DictSelection>
  238. </el-form-item>
  239. </el-row>
  240. <el-row>
  241. <el-form-item label="客户名称:">
  242. <el-input
  243. v-model="where.customerName"
  244. size="mini"
  245. placeholder="请输入"
  246. ></el-input>
  247. </el-form-item>
  248. </el-row>
  249. <el-row>
  250. <el-form-item label="销售类型:">
  251. <DictSelection
  252. dictName="订单类型"
  253. clearable
  254. size="mini"
  255. v-model="where.saleType"
  256. >
  257. </DictSelection>
  258. </el-form-item>
  259. </el-row>
  260. <el-row>
  261. <el-form-item label="业务员:">
  262. <el-input
  263. v-model="where.salesman"
  264. size="mini"
  265. placeholder="请输入"
  266. ></el-input>
  267. </el-form-item>
  268. </el-row>
  269. <el-row>
  270. <el-form-item label="产品名称:">
  271. <el-input
  272. v-model="where.productName"
  273. size="mini"
  274. placeholder="请输入"
  275. ></el-input>
  276. </el-form-item>
  277. </el-row>
  278. <el-row>
  279. <el-form-item label="组织机构:">
  280. <auth-selection
  281. data-type="Array"
  282. size="mini"
  283. v-model="where.deptIds"
  284. style="width: 100%"
  285. ></auth-selection>
  286. </el-form-item>
  287. </el-row>
  288. <el-row>
  289. <el-form-item label="按单按库:">
  290. <el-select
  291. v-model="where.orderLibraryType"
  292. placeholder="请选择"
  293. class="w100"
  294. size="mini"
  295. >
  296. <el-option
  297. v-for="item in orderTypeList"
  298. :key="item.value"
  299. :label="item.label"
  300. :value="item.value"
  301. >
  302. </el-option>
  303. </el-select>
  304. </el-form-item>
  305. </el-row>
  306. </div>
  307. </el-dropdown-menu>
  308. </el-dropdown>
  309. <el-button
  310. type="primary"
  311. size="mini"
  312. icon="el-icon-search"
  313. class="ele-btn-icon"
  314. @click="search"
  315. >
  316. 查询
  317. </el-button>
  318. <el-button
  319. @click="reset"
  320. size="mini"
  321. icon="el-icon-refresh-left"
  322. type="primary"
  323. >重置</el-button
  324. >
  325. </div>
  326. </el-col>
  327. <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }">
  328. <el-form-item label-width="0px">
  329. <div class="btn-wrapper">
  330. <!-- <el-button
  331. @click="payBudget"
  332. size="mini"
  333. type="danger"
  334. >
  335. 交期预估</el-button
  336. > -->
  337. <el-button
  338. @click="homogeneityInspect"
  339. size="mini"
  340. type="success"
  341. >
  342. 齐套性检查</el-button
  343. >
  344. <el-button
  345. @click="goProduct"
  346. size="mini"
  347. v-if="activeName != 'second'"
  348. >
  349. 转生产计划</el-button
  350. >
  351. <el-button
  352. type="primary"
  353. size="mini"
  354. @click="orderRefresh"
  355. :loading="loading"
  356. >订单刷新</el-button
  357. >
  358. <el-button
  359. type="success"
  360. size="mini"
  361. @click="toCreate"
  362. v-if="activeName == 'first'"
  363. >创建订单</el-button
  364. >
  365. <el-upload
  366. class="avatar-uploader"
  367. action="#"
  368. :show-file-list="false"
  369. v-if="activeName == 'first'"
  370. :http-request="uploadFile"
  371. :before-upload="beforeUpload"
  372. :on-change="handleChange"
  373. ref="uploadFile"
  374. >
  375. <el-button type="warning" size="mini">批量导入</el-button>
  376. </el-upload>
  377. <el-button type="info" size="mini">
  378. 下载模板
  379. </el-button>
  380. <el-button
  381. type="danger"
  382. size="mini"
  383. @click="batchDelete"
  384. v-if="activeName == 'first'"
  385. >批量删除</el-button
  386. >
  387. <el-button
  388. type="danger"
  389. size="mini"
  390. @click="synchronous"
  391. v-if="activeName == 'first' && clientEnvironmentId == 2"
  392. >同步数据</el-button
  393. >
  394. </div>
  395. </el-form-item>
  396. </el-col>
  397. </el-row>
  398. <!-- 导入异常 -->
  399. <import-exception ref="importDialog"> </import-exception>
  400. <!-- 创建订单 -->
  401. <create-order ref="createDialog" @refresh="search"> </create-order>
  402. <!-- 订单组合 -->
  403. <group-order ref="groupDialog"> </group-order>
  404. </el-form>
  405. </template>
  406. <script>
  407. import ImportException from '../components/import-exception.vue';
  408. import CreateOrder from '../components/create-order.vue';
  409. import GroupOrder from '../components/group-order.vue';
  410. import { importFile } from '@/api/saleOrder';
  411. import {
  412. pullSalesOrder,
  413. deleteOrder,
  414. synchronousDataByJDY
  415. } from '@/api/saleOrder';
  416. export default {
  417. props: {
  418. selection: Array,
  419. activeName: String
  420. },
  421. components: {
  422. ImportException,
  423. CreateOrder,
  424. GroupOrder
  425. },
  426. data() {
  427. // 默认表单数据
  428. const defaultWhere = {
  429. keyWord: '',
  430. code: '',
  431. productCode: '',
  432. customerName: '',
  433. lineNumber: '',
  434. model: '',
  435. brandNo: '',
  436. orderSource: 0,
  437. saleType: 0,
  438. proStu: '',
  439. orderLibraryType: 0,
  440. salesman: '',
  441. productName: ''
  442. };
  443. return {
  444. // 表单数据
  445. defaultWhere,
  446. where: { ...defaultWhere },
  447. time: [],
  448. fileList: [],
  449. awaitProcuct: [{ value: 1, label: '待排产' }],
  450. alreadyProcuct: [
  451. { value: 0, label: '所有状态' },
  452. { value: 2, label: '待发布' },
  453. { value: 3, label: '发布失败' },
  454. { value: 4, label: '待生产' },
  455. { value: 5, label: '生产中' },
  456. { value: 6, label: '已完成' },
  457. { value: 7, label: '已延期' }
  458. ],
  459. orderTypeList: [
  460. { value: 0, label: '所有' },
  461. { value: 1, label: '按单' },
  462. { value: 2, label: '按库' }
  463. ],
  464. orderList: [{
  465. value: 0, label: '库存性订单'
  466. },
  467. {
  468. value: 1, label: '生产性订单'
  469. },
  470. {
  471. value: 2, label: '无客户生产性订单'
  472. },
  473. {
  474. value: 4, label: '不定向订单'
  475. },],
  476. loading: false
  477. };
  478. },
  479. computed: {
  480. // 是否开启响应式布局
  481. styleResponsive() {
  482. return this.$store.state.theme.styleResponsive;
  483. },
  484. clientEnvironmentId() {
  485. return this.$store.state.user.info.clientEnvironmentId;
  486. },
  487. },
  488. watch: {
  489. activeName: {
  490. handler() {
  491. if (this.activeName == 'first') {
  492. this.where.proStu = 1;
  493. } else {
  494. this.where.proStu = 0;
  495. }
  496. this.reset();
  497. },
  498. immediate: true
  499. }
  500. },
  501. created() {},
  502. methods: {
  503. /* 搜索 */
  504. search() {
  505. if (this.time.length) {
  506. this.where.startTime = this.time[0];
  507. this.where.endTime = this.time[1];
  508. }
  509. this.$emit('search', this.where);
  510. },
  511. /* 重置 */
  512. reset() {
  513. this.time = [];
  514. this.where = { ...this.defaultWhere };
  515. if (this.activeName == 'first') {
  516. this.where.proStu = 1;
  517. } else {
  518. this.where.proStu = 0;
  519. }
  520. this.search();
  521. },
  522. toImport() {
  523. this.$refs.importDialog.open();
  524. },
  525. toCreate() {
  526. this.$refs.createDialog.open();
  527. },
  528. toGroup() {
  529. this.$refs.groupDialog.open();
  530. },
  531. goProduct() {
  532. if (!this.selection.length) {
  533. return this.$message.warning('请先勾选一个或多个订单!');
  534. }
  535. const productCode = this.selection[0].productCode;
  536. const orderType = this.selection[0].orderType;
  537. const produceRoutingId = this.selection[0].produceRoutingId;
  538. const measuringUnit = this.selection[0].measuringUnit;
  539. const factoriesId = this.selection[0].factoriesId;
  540. const bomCategoryId = this.selection[0].bomCategoryId
  541. const saleType = this.selection[0].saleType;
  542. // if(!factoriesId){
  543. // this.$message.warning('工厂未选择!');
  544. // return;
  545. // }
  546. for (var i = 0; i < this.selection.length; i++) {
  547. if (productCode != this.selection[i].productCode) {
  548. return this.$message.warning('产品编码不一致!');
  549. }
  550. if (orderType != this.selection[i].orderType) {
  551. return this.$message.warning('订单类型不一致!');
  552. }
  553. if (saleType != this.selection[i].saleType) {
  554. return this.$message.warning('销售类型不一致!');
  555. }
  556. if (produceRoutingId != this.selection[i].produceRoutingId) {
  557. return this.$message.warning('工艺路线不一致!');
  558. }
  559. if (measuringUnit != this.selection[i].measuringUnit) {
  560. return this.$message.warning('计量单位不一致!');
  561. }
  562. if (factoriesId != this.selection[i].factoriesId) {
  563. return this.$message.warning('所属工厂不一致!');
  564. }
  565. }
  566. const list = [];
  567. this.selection.map((item) => {
  568. list.push(item.id);
  569. });
  570. this.$router.push({
  571. path: '/saleOrder/salesToProduction',
  572. query: {
  573. selection: JSON.stringify(list),
  574. produceRoutingId: produceRoutingId,
  575. produceRoutingName: this.selection[0].produceRoutingName,
  576. factoriesId: factoriesId,
  577. bomCategoryId: bomCategoryId
  578. }
  579. });
  580. },
  581. // 刷新订单
  582. orderRefresh() {
  583. this.loading = true;
  584. pullSalesOrder()
  585. .then((res) => {
  586. this.$message.success('刷新成功!');
  587. this.loading = false;
  588. })
  589. .catch(() => {
  590. this.loading = false;
  591. });
  592. },
  593. // 点击批量删除
  594. batchDelete() {
  595. if (!this.selection.length) {
  596. return this.$message.warning('请先勾选一个或多个订单!');
  597. }
  598. let ids = [];
  599. this.selection.map((item) => {
  600. ids.push(item.id);
  601. });
  602. this.$confirm('此操作将永久删除所选择的订单, 是否继续?', '提示', {
  603. confirmButtonText: '确定',
  604. cancelButtonText: '取消',
  605. type: 'warning'
  606. })
  607. .then(() => {
  608. deleteOrder(ids).then((res) => {
  609. this.$message.success(res);
  610. this.search();
  611. });
  612. })
  613. .catch(() => {});
  614. },
  615. handleChange(file, fileList) {
  616. this.fileList = fileList;
  617. console.log(fileList);
  618. },
  619. //上传限制
  620. beforeUpload(file) {
  621. const isLt10M = file.size / 1024 / 1024 < 10;
  622. if (!isLt10M) {
  623. this.$message.error('上传文件大小不能超过 10MB!');
  624. }
  625. return isLt10M;
  626. },
  627. //文件上传
  628. uploadFile(param) {
  629. let fd = new FormData();
  630. this.fileList.forEach((item) => {
  631. fd.append('importExcel', item.raw);
  632. });
  633. importFile(fd)
  634. .then((res) => {
  635. this.$emit('search', this.where);
  636. this.$refs.uploadFile.clearFiles();
  637. })
  638. .catch((data) => {
  639. if (data.code != -1) {
  640. this.$message.error(data.message);
  641. }
  642. })
  643. .finally(() => {
  644. this.$refs.uploadFile.clearFiles();
  645. });
  646. },
  647. synchronous() {
  648. synchronousDataByJDY().then((res) => {
  649. this.$message.success('同步成功!');
  650. this.reset()
  651. });
  652. },
  653. payBudget(){
  654. },
  655. homogeneityInspect(){
  656. this.$emit('check');
  657. },
  658. }
  659. };
  660. </script>
  661. <style lang="scss" scoped>
  662. .ele-form-actions {
  663. display: flex;
  664. align-items: center;
  665. justify-content: flex-start;
  666. padding-top: 4.5px;
  667. }
  668. .btn-wrapper {
  669. display: flex;
  670. align-items: center;
  671. justify-content: flex-start;
  672. flex-wrap: wrap;
  673. }
  674. .avatar-uploader {
  675. display: inline-block;
  676. margin: 0 10px;
  677. }
  678. .button-link {
  679. color: #fff;
  680. }
  681. .searchExpend{
  682. padding: 20px 50px 0 30px;
  683. }
  684. </style>