order-search.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. <!-- 搜索表单 -->
  2. <template>
  3. <el-form label-width="90px" class="ele-form-search" @keyup.enter.native="search" @submit.native.prevent>
  4. <el-row :gutter="15">
  5. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  6. <el-form-item label="关键字:">
  7. <el-input v-model="where.keyWord" placeholder="请输入"></el-input>
  8. </el-form-item>
  9. </el-col>
  10. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  11. <el-form-item label="销售订单号:">
  12. <el-input v-model="where.code" placeholder="请输入"></el-input>
  13. </el-form-item>
  14. </el-col>
  15. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  16. <el-form-item label="物料编码:">
  17. <el-input v-model="where.productCode" placeholder="请输入"></el-input>
  18. </el-form-item>
  19. </el-col>
  20. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  21. <el-form-item label="行号:">
  22. <el-input v-model="where.lineNumber" placeholder="请输入"></el-input>
  23. </el-form-item>
  24. </el-col>
  25. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  26. <el-form-item label="牌号:">
  27. <el-input v-model="where.brandNo" placeholder="请输入"></el-input>
  28. </el-form-item>
  29. </el-col>
  30. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  31. <el-form-item label="型号:">
  32. <el-input v-model="where.model" placeholder="请输入"></el-input>
  33. </el-form-item>
  34. </el-col>
  35. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  36. <el-form-item label="订单来源:">
  37. <DictSelection dictName="订单来源" clearable v-model="where.orderSource">
  38. </DictSelection>
  39. </el-form-item>
  40. </el-col>
  41. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  42. <el-form-item label="客户名称:">
  43. <el-input v-model="where.customerName" placeholder="请输入"></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. <DictSelection dictName="订单类型" clearable v-model="where.orderType">
  49. </DictSelection>
  50. </el-form-item>
  51. </el-col>
  52. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  53. <el-form-item label="生产状态:">
  54. <el-select v-model="where.proStu" placeholder="请选择" class="w100">
  55. <el-option v-if="activeName == 'first'" v-for="item in awaitProcuct" :key="item.value" :label="item.label"
  56. :value="item.value">
  57. </el-option>
  58. <el-option v-if="activeName == 'second'" v-for="item in alreadyProcuct" :key="item.value" :label="item.label"
  59. :value="item.value">
  60. </el-option>
  61. </el-select>
  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. <el-select v-model="where.orderLibraryType" placeholder="请选择" class="w100">
  67. <el-option v-for="item in orderTypeList" :key="item.value" :label="item.label" :value="item.value">
  68. </el-option>
  69. </el-select>
  70. </el-form-item>
  71. </el-col>
  72. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  73. <el-form-item label="业务员:">
  74. <el-input v-model="where.salesman" placeholder="请输入"></el-input>
  75. </el-form-item>
  76. </el-col>
  77. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  78. <el-form-item label="产品名称:">
  79. <el-input v-model="where.productName" placeholder="请输入"></el-input>
  80. </el-form-item>
  81. </el-col>
  82. <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
  83. <el-form-item label="交货日期:">
  84. <el-date-picker style="width: 100%" v-model="time" type="daterange" range-separator="至" start-placeholder="开始日期"
  85. end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" :default-time="['00:00:00', '23:59:59']">
  86. </el-date-picker>
  87. </el-form-item>
  88. </el-col>
  89. <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">
  90. <el-form-item label="组织机构:">
  91. <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>
  92. </el-form-item>
  93. </el-col>
  94. <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">
  95. <div class="ele-form-actions">
  96. <el-button type="primary" icon="el-icon-search" class="ele-btn-icon" @click="search">
  97. 查询
  98. </el-button>
  99. <el-button @click="reset" icon="el-icon-refresh-left" type="primary">重置</el-button>
  100. </div>
  101. </el-col>
  102. <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }">
  103. <el-form-item label-width="0px">
  104. <div class="btn-wrapper">
  105. <el-button @click="goProduct">转生产计划</el-button>
  106. <el-button type="primary" @click="orderRefresh" :loading="loading">订单刷新</el-button>
  107. <el-button type="success" @click="toCreate">创建订单</el-button>
  108. <el-upload class="avatar-uploader" action="#" :show-file-list="false" :http-request="uploadFile"
  109. :before-upload="beforeUpload" :on-change="handleChange" ref="uploadFile">
  110. <el-button type="warning">批量导入</el-button>
  111. </el-upload>
  112. <el-button type="info">
  113. <a :href="fileUrl" download="销售订单导入模板.xls" class="button-link">下载模板</a>
  114. </el-button>
  115. <el-button type="danger" @click="batchDelete">批量删除</el-button>
  116. </div>
  117. </el-form-item>
  118. </el-col>
  119. </el-row>
  120. <!-- 导入异常 -->
  121. <import-exception ref="importDialog"> </import-exception>
  122. <!-- 创建订单 -->
  123. <create-order ref="createDialog" @refresh="search"> </create-order>
  124. <!-- 订单组合 -->
  125. <group-order ref="groupDialog"> </group-order>
  126. </el-form>
  127. </template>
  128. <script>
  129. import ImportException from '../components/import-exception.vue';
  130. import CreateOrder from '../components/create-order.vue';
  131. import GroupOrder from '../components/group-order.vue';
  132. import { importFile } from '@/api/saleOrder';
  133. import fileUrl from '@/assets/file/销售订单导入模板.xls';
  134. import { pullSalesOrder, deleteOrder } from '@/api/saleOrder';
  135. export default {
  136. props: {
  137. selection: Array,
  138. activeName: String
  139. },
  140. components: {
  141. ImportException,
  142. CreateOrder,
  143. GroupOrder
  144. },
  145. data() {
  146. // 默认表单数据
  147. const defaultWhere = {
  148. keyWord: '',
  149. code: '',
  150. productCode: '',
  151. customerName: '',
  152. lineNumber: '',
  153. model: '',
  154. brandNo: '',
  155. orderSource: 0,
  156. orderType: 0,
  157. proStu: '',
  158. orderLibraryType: 0,
  159. salesman: '',
  160. productName: ''
  161. };
  162. return {
  163. fileUrl,
  164. // 表单数据
  165. defaultWhere,
  166. where: { ...defaultWhere },
  167. time: [],
  168. fileList: [],
  169. awaitProcuct: [{ value: 1, label: '待排产' }],
  170. alreadyProcuct: [
  171. { value: 0, label: '所有状态' },
  172. { value: 2, label: '待发布' },
  173. { value: 3, label: '发布失败' },
  174. { value: 4, label: '待生产' },
  175. { value: 5, label: '生产中' },
  176. { value: 6, label: '已完成' },
  177. { value: 7, label: '已延期' }
  178. ],
  179. orderTypeList: [
  180. { value: 0, label: '所有' },
  181. { value: 1, label: '按单' },
  182. { value: 2, label: '按库' }
  183. ],
  184. loading: false
  185. };
  186. },
  187. computed: {
  188. // 是否开启响应式布局
  189. styleResponsive() {
  190. return this.$store.state.theme.styleResponsive;
  191. }
  192. },
  193. watch: {
  194. activeName: {
  195. handler() {
  196. if (this.activeName == 'first') {
  197. this.where.proStu = 1;
  198. } else {
  199. this.where.proStu = 0;
  200. }
  201. this.reset();
  202. },
  203. immediate: true
  204. }
  205. },
  206. created() { },
  207. methods: {
  208. /* 搜索 */
  209. search() {
  210. if (this.time.length) {
  211. this.where.startTime = this.time[0];
  212. this.where.endTime = this.time[1];
  213. }
  214. this.$emit('search', this.where);
  215. },
  216. /* 重置 */
  217. reset() {
  218. this.time = [];
  219. this.where = { ...this.defaultWhere };
  220. if (this.activeName == 'first') {
  221. this.where.proStu = 1;
  222. } else {
  223. this.where.proStu = 0;
  224. }
  225. this.search();
  226. },
  227. toImport() {
  228. this.$refs.importDialog.open();
  229. },
  230. toCreate() {
  231. this.$refs.createDialog.open();
  232. },
  233. toGroup() {
  234. this.$refs.groupDialog.open();
  235. },
  236. goProduct() {
  237. if (!this.selection.length) {
  238. return this.$message.warning('请先勾选一个或多个订单!');
  239. }
  240. const productCode = this.selection[0].productCode;
  241. const orderType = this.selection[0].orderType;
  242. const produceRoutingId = this.selection[0].produceRoutingId
  243. for (var i = 0; i < this.selection.length; i++) {
  244. if (productCode != this.selection[i].productCode) {
  245. return this.$message.warning('产品编码不一致!');
  246. }
  247. if (orderType != this.selection[i].orderType) {
  248. return this.$message.warning('订单类型不一致!');
  249. }
  250. if (produceRoutingId != this.selection[i].produceRoutingId) {
  251. return this.$message.warning('工艺路线不一致!');
  252. }
  253. }
  254. const list = [];
  255. this.selection.map((item) => {
  256. list.push(item.id);
  257. });
  258. this.$router.push({
  259. path: '/saleOrder/salesToProduction',
  260. query: {
  261. selection: JSON.stringify(list),
  262. produceRoutingId: produceRoutingId,
  263. produceRoutingName: this.selection[0].produceRoutingName
  264. }
  265. });
  266. },
  267. // 刷新订单
  268. orderRefresh() {
  269. this.loading = true;
  270. pullSalesOrder()
  271. .then((res) => {
  272. this.$message.success('刷新成功!');
  273. this.loading = false;
  274. })
  275. .catch(() => {
  276. this.loading = false;
  277. });
  278. },
  279. // 点击批量删除
  280. batchDelete() {
  281. if (!this.selection.length) {
  282. return this.$message.warning('请先勾选一个或多个订单!');
  283. }
  284. let ids = [];
  285. this.selection.map((item) => {
  286. ids.push(item.id);
  287. });
  288. this.$confirm('此操作将永久删除所选择的订单, 是否继续?', '提示', {
  289. confirmButtonText: '确定',
  290. cancelButtonText: '取消',
  291. type: 'warning'
  292. })
  293. .then(() => {
  294. deleteOrder(ids).then((res) => {
  295. this.$message.success(res);
  296. this.search();
  297. });
  298. })
  299. .catch(() => { });
  300. },
  301. handleChange(file, fileList) {
  302. this.fileList = fileList;
  303. console.log(fileList);
  304. },
  305. //上传限制
  306. beforeUpload(file) {
  307. const isLt10M = file.size / 1024 / 1024 < 10;
  308. if (!isLt10M) {
  309. this.$message.error('上传文件大小不能超过 10MB!');
  310. }
  311. return isLt10M;
  312. },
  313. //文件上传
  314. uploadFile(param) {
  315. let fd = new FormData();
  316. this.fileList.forEach((item) => {
  317. fd.append('importExcel', item.raw);
  318. });
  319. importFile(fd)
  320. .then((res) => {
  321. this.$emit('search', this.where);
  322. this.$refs.uploadFile.clearFiles();
  323. })
  324. .catch((data) => {
  325. if (data.code != -1) {
  326. this.$message.error(data.message);
  327. }
  328. })
  329. .finally(() => {
  330. this.$refs.uploadFile.clearFiles();
  331. });
  332. }
  333. }
  334. };
  335. </script>
  336. <style lang="scss" scoped>
  337. .ele-form-actions {
  338. display: flex;
  339. align-items: center;
  340. justify-content: flex-end;
  341. }
  342. .btn-wrapper {
  343. display: flex;
  344. align-items: center;
  345. justify-content: flex-start;
  346. flex-wrap: wrap;
  347. }
  348. .avatar-uploader {
  349. display: inline-block;
  350. margin: 0 10px;
  351. }
  352. .button-link {
  353. color: #fff;
  354. }
  355. </style>