SelectSaleOrderModal.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. <template>
  2. <a-modal
  3. title="选择销售订单(Select Sale Order)"
  4. width="95%"
  5. :visible="visible"
  6. :maskClosable="false"
  7. switchFullscreen
  8. @ok = "handleOk"
  9. @cancel="handleCancel">
  10. <div>
  11. <a-card :body-style="{ padding: '10px' }" :bordered="false" style="margin: 10px;">
  12. <div class="table-page-search-wrapper">
  13. <a-form :model="queryParams" @keyup.enter.native="searchQuery" :label-col="{ style: 'width: 200px' }">
  14. <a-row :gutter="24">
  15. <a-col :md="6" :sm="8">
  16. <a-form-item label="订单编号(bill code)">
  17. <j-input placeholder="请输入" v-model:value="queryParams.billCode"></j-input>
  18. </a-form-item>
  19. </a-col>
  20. <a-col :md="6" :sm="8">
  21. <a-form-item label="单据日期(bill date)">
  22. <a-range-picker value-format="YYYY-MM-DD" v-model:value="billDate" @change="changeBillDate" class="query-group-cust"/>
  23. </a-form-item>
  24. </a-col>
  25. <template v-if="toggleSearchStatus">
  26. <a-col :md="6" :sm="8">
  27. <a-form-item label="项目(project)">
  28. <ApiSelect
  29. :api="ProjectOption"
  30. showSearch
  31. v-model:value="queryParams.project"
  32. optionFilterProp="label"
  33. resultField="records"
  34. labelField="code"
  35. valueField="id"
  36. :params='{pageSize:-1}'
  37. :disabled="fatherProject!==''"
  38. />
  39. </a-form-item>
  40. </a-col>
  41. <a-col :md="6" :sm="8">
  42. <a-form-item label="产品分类(production class)" >
  43. <!-- <j-input placeholder="请输入" v-model:value="queryParams.classId"></j-input> -->
  44. <ApiSelect
  45. :api="ClassList"
  46. showSearch
  47. v-model:value="queryParams.productionClass"
  48. optionFilterProp="label"
  49. resultField="records"
  50. labelField="name"
  51. valueField="id"
  52. :params='{pageSize:-1}'
  53. />
  54. </a-form-item>
  55. </a-col>
  56. <a-col :md="6" :sm="8">
  57. <a-form-item label="优先级(priority)" >
  58. <JDictSelectTag v-model:value="queryParams.priority" placeholder="请选择" dictCode="priority"/>
  59. </a-form-item>
  60. </a-col>
  61. <a-col :md="12" :sm="16" v-if="showCustomer=='no'">
  62. <a-form-item label="供应商(supplier)" >
  63. <JSelect v-model:value="queryParams.supplierId" :get-option-url="supplierOption" :showField="showField" :disabled="fatherSupplier!==''"></JSelect>
  64. </a-form-item>
  65. </a-col>
  66. <a-col :md="12" :sm="16" v-if="showCustomer=='yes'">
  67. <a-form-item label="客户(customer)">
  68. <JSelect v-model:value="queryParams.customer" :get-option-url="CustomerOption" :showField="showField" @change="changeCustmer"></JSelect>
  69. </a-form-item>
  70. </a-col>
  71. <a-col :md="6" :sm="8">
  72. <a-form-item label="机型(model)">
  73. <JDictSelectTag v-model:value="queryParams.headModel" placeholder="请选择" dictCode="model_typer" style="width: 100%;"/>
  74. </a-form-item>
  75. </a-col>
  76. <a-col :md="6" :sm="8">
  77. <a-form-item label="产品英文名(English name)" >
  78. <j-input placeholder="请输入" v-model:value="queryParams.englishName"></j-input>
  79. </a-form-item>
  80. </a-col>
  81. <a-col :md="6" :sm="8">
  82. <a-form-item label="产品编码(product code)">
  83. <j-input placeholder="请输入" v-model:value="queryParams.productCode"></j-input>
  84. </a-form-item>
  85. </a-col>
  86. <a-col :md="6" :sm="8">
  87. <a-form-item label="型号(model)">
  88. <j-input placeholder="请输入" v-model:value="queryParams.childModel"></j-input>
  89. </a-form-item>
  90. </a-col>
  91. <a-col :md="6" :sm="8">
  92. <a-form-item label="业务员(salesman)">
  93. <j-input placeholder="请输入" v-model:value="queryParams.salesman"></j-input>
  94. </a-form-item>
  95. </a-col>
  96. <a-col :md="6" :sm="8">
  97. <a-form-item label="销售部门(sale department)" >
  98. <j-input placeholder="请输入" v-model:value="queryParams.saleDepartment"></j-input>
  99. </a-form-item>
  100. </a-col>
  101. </template>
  102. <a-col :md="6" :sm="8">
  103. <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
  104. <a-button type="primary" @click="searchQuery" >查询(search)</a-button>
  105. <a-button type="primary" @click="searchReset" style="margin-left: 8px">重置(reset)</a-button>
  106. <a @click="handleToggleSearch" style="margin-left: 8px">
  107. {{ toggleSearchStatus ? '收起' : '展开' }}
  108. <a-icon :type="toggleSearchStatus ? 'up' : 'down'" />
  109. </a>
  110. </span>
  111. </a-col>
  112. </a-row>
  113. </a-form>
  114. </div>
  115. </a-card>
  116. <a-card :body-style="{ padding: '10px' }" :bordered="false" style="margin: 10px;">
  117. <a-alert type="info" show-icon class="alert" style="margin-bottom: 8px">
  118. <template #message>
  119. <template v-if="selectedRowKeys.length > 0">
  120. <span>已选中 {{ selectedRowKeys.length }} 条记录</span>
  121. <a-divider type="vertical" />
  122. <a @click="selectedRowKeys = []">清空</a>
  123. </template>
  124. <template v-else>
  125. <span>未选中任何数据</span>
  126. </template>
  127. </template>
  128. </a-alert>
  129. <a-table
  130. :columns="columns"
  131. :row-key="record => record.childId"
  132. :data-source="dataSource"
  133. bordered
  134. size="small"
  135. @change="handleTableChange"
  136. :pagination="pagination"
  137. :scroll="{ x: 4000, y: 400 }"
  138. :rowSelection="{ onSelect: onSelect, onSelectAll: onSelectAll, selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
  139. >
  140. </a-table>
  141. </a-card>
  142. </div>
  143. </a-modal>
  144. </template>
  145. <script lang="ts" setup>
  146. import {ref, reactive } from 'vue';
  147. import { defHttp} from '/@/utils/http/axios';
  148. import { message } from 'ant-design-vue';
  149. import { filterObj, getFileAccessHttpUrl } from '/@/utils/common/compUtils';
  150. import { JDictSelectTag,ApiSelect,JInput,JSelect} from '/@/components/Form';
  151. import {ProjectOption,ClassList,supplierOption} from '../saleCode/deliveryNotice/delivertNoticeForm.api';
  152. import {CustomerOption} from '../saleCode/saleContract/SaleContract.api';
  153. const emit = defineEmits([ 'selectSaleOrder']); //定义emit
  154. var showField = ref('currency_dictText+name');
  155. var visible = ref(false)
  156. var fatherProject = ref('')
  157. var fatherSourceCode = ref('')
  158. var fatherSupplier =ref('')
  159. var fatherType = ref('')
  160. var fatherCustomer=ref('')
  161. var showCustomer = ref('no')
  162. var getListUrl =ref('')
  163. var columns=[]
  164. var columns1 = [
  165. {
  166. type: 'selection',
  167. fixed: 'left',
  168. width:0
  169. },
  170. {
  171. title: '订单编号号(bill code)',
  172. dataIndex: 'billCode',
  173. key: 'billCode',
  174. align:"center",
  175. width:250,
  176. },
  177. {
  178. title: '单据日期(bill date)',
  179. dataIndex: 'billDate',
  180. key: 'billDate',
  181. align:"center"
  182. },
  183. {
  184. title: '项目(project)',
  185. dataIndex: 'projectName',
  186. key: 'projectName',
  187. align:"center",
  188. width:250,
  189. ellipsis: true,
  190. },
  191. {
  192. title: '供应商(supplier)',
  193. dataIndex: 'supplierName',
  194. key: 'supplierName',
  195. align:"center",
  196. ellipsis: true,
  197. ifShow:showCustomer.value=='no'?true:false,
  198. // className:showCustomer.value=='no'?'tableShow':'tableHiddle'
  199. },
  200. {
  201. title: '客户(customer)',
  202. dataIndex: 'customerName',
  203. key: 'customerName',
  204. align:"center",
  205. width:250,
  206. // ellipsis: true,
  207. // className:showCustomer.value=='yes'?'tableShow':'tableHiddl
  208. },
  209. {
  210. title: '优先级(priority)',
  211. dataIndex: 'priority_dictText',
  212. key: 'priority_dictText',
  213. align:"center"
  214. },
  215. {
  216. title: '产品分类(production class)',
  217. dataIndex: 'productionClass_dictText',
  218. key: 'productionClass_dictText',
  219. align:"center",
  220. width:250,
  221. },
  222. {
  223. title: '机型(model)',
  224. dataIndex: 'headModel',
  225. key: 'headModel',
  226. align:"center"
  227. },
  228. {
  229. title: '销售部门(sale department)',
  230. dataIndex: 'saleDepartment',
  231. key: 'saleDepartment',
  232. align:"center"
  233. },
  234. {
  235. title: '业务员(salesman)',
  236. dataIndex: 'salesman',
  237. key: 'salesman',
  238. align:"center"
  239. },
  240. {
  241. title: '产品编码(product code)',
  242. dataIndex: 'productCode',
  243. key: 'productCode',
  244. align:"center",
  245. width:250,
  246. },
  247. {
  248. title: '产品英文名(English name)',
  249. key: 'englishName',
  250. dataIndex: 'englishName',
  251. align:"center",
  252. width:250,
  253. ellipsis: true,
  254. },
  255. {
  256. title: '型号(childModel)',
  257. key: 'childModel',
  258. dataIndex: 'childModel',
  259. align:"center"
  260. },
  261. {
  262. title: '厂家(factory)',
  263. key: 'factory',
  264. dataIndex: 'factory',
  265. align:"center",
  266. width:250
  267. },
  268. {
  269. title: '质量等级(quantity grade)',
  270. key: 'quantityGrade',
  271. dataIndex: 'quantityGrade',
  272. align:"center",
  273. width:250,
  274. },
  275. {
  276. title: '数量(quantity)',
  277. key: 'quantity',
  278. dataIndex: 'quantity',
  279. align:"center",
  280. width:250,
  281. },
  282. // {
  283. // title: '单价(price)',
  284. // key: 'taxPrice',
  285. // dataIndex: 'taxPrice',
  286. // align:"center",
  287. // width:250,
  288. // },
  289. // {
  290. // title: '金额(tax money)',
  291. // key: 'taxAmount',
  292. // dataIndex: 'taxAmount',
  293. // align:"center",
  294. // width:250,
  295. // },
  296. ];
  297. const labelCol = ref({
  298. xs: { span: 24 },
  299. sm: { span: 9 },
  300. });
  301. const wrapperCol = ref({
  302. xs: { span: 24 },
  303. sm: { span: 15 },
  304. });
  305. const labelCol1 = ref({
  306. xs: { span: 24 },
  307. sm: { span: 12 },
  308. });
  309. const wrapperCol1 = ref({
  310. xs: { span: 24 },
  311. sm: { span: 12 },
  312. });
  313. const dataSource =ref([]);
  314. let selectedRowKeys = ref([]);
  315. let selectionRows = ref([]);
  316. const toggleSearchStatus = ref(false);
  317. var billDate = ref([])
  318. const queryParams = ref({
  319. billCode:'',
  320. project:'',
  321. projectName:'',
  322. productionClass:'',
  323. priority:'',
  324. supplierId:'',
  325. supplier:'',
  326. headModel:'',
  327. englishName:'',
  328. productCode:'',
  329. childModel:'',
  330. billDate_begin:'',
  331. billDate_end:'',
  332. saleDepartment:'',
  333. salesman:'',
  334. customer:'',
  335. });
  336. let pagination = ref({
  337. current: 1,
  338. pageSize: 10,
  339. total: '', // 假设总共有100条数据
  340. showSizeChanger: true,
  341. showQuickJumper: true,
  342. showTotal: (total, range) => {
  343. return range[0] + "-" + range[1] + " 共" + total + "条"
  344. },
  345. size:'small'
  346. });
  347. function loadData(){
  348. let params = getQueryParams();
  349. defHttp.get({ url: getListUrl.value ,params}, { isTransformResponse: false })
  350. .then((res) => {
  351. if (res.success) {
  352. dataSource.value = res.result.records;
  353. pagination.value.total = res.result.total;
  354. pagination.value.current = res.result.current;
  355. pagination.value.pageSize = res.result.size;
  356. } else {
  357. message.error(res.message);
  358. }
  359. })
  360. .finally(() => {
  361. // loading.value = false;
  362. });
  363. }
  364. function getQueryParams(){
  365. let params = Object.assign(queryParams.value);
  366. params.pageNo = pagination.value.current;
  367. params.pageSize = pagination.value.pageSize;
  368. if(fatherProject.value&&fatherProject.value!==''){
  369. queryParams.value.project = fatherProject.value
  370. }else {
  371. queryParams.value.project = params.project
  372. }
  373. if(fatherSupplier.value&&fatherSupplier.value!==''){
  374. queryParams.value.supplierId = fatherSupplier.value
  375. }else {
  376. queryParams.value.supplierId = params.supplierId
  377. }
  378. if(fatherCustomer.value&&fatherCustomer.value!==''){
  379. queryParams.value.customer = fatherCustomer.value
  380. }else {
  381. queryParams.value.customer = params.customer
  382. }
  383. return filterObj(params);
  384. }
  385. function handleTableChange(paginations, filters, sorter){
  386. pagination.value.total = paginations.total;
  387. pagination.value.current = paginations.current;
  388. pagination.value.pageSize = paginations.pageSize;
  389. loadData()
  390. }
  391. function searchQuery(){
  392. pagination.value.current = 1
  393. selectedRowKeys.value = []
  394. selectionRows.value=[]
  395. loadData();
  396. }
  397. function searchReset(){
  398. billDate.value = []
  399. queryParams.value = {
  400. billCode:'',
  401. project:'',
  402. projectName:'',
  403. productionClass:'',
  404. priority:'',
  405. supplierId:'',
  406. supplier:'',
  407. headModel:'',
  408. englishName:'',
  409. productCode:'',
  410. childModel:'',
  411. billDate_begin:'',
  412. billDate_end:'',
  413. saleDepartment:'',
  414. salesman:'',
  415. customer:'',
  416. }
  417. pagination.value.current =1;
  418. pagination.value.pageSize = 10;
  419. selectedRowKeys.value = []
  420. selectionRows.value=[]
  421. loadData();
  422. }
  423. function handleToggleSearch(){
  424. toggleSearchStatus.value = !toggleSearchStatus.value;
  425. }
  426. function onSelectChange(selectedRowKeys1, selectionRows1) {
  427. var arr = []
  428. selectionRows.value.map(item=>{
  429. arr.push(item.childId)
  430. })
  431. selectedRowKeys.value = arr
  432. }
  433. function onSelect(record, selected, selectionRows1, nativeEvent) {
  434. if (selected) {
  435. selectionRows.value.push(record)
  436. console.log( selectionRows.value);
  437. }else{
  438. const delIndex = selectionRows.value.findIndex((val) => {
  439. return val.childId === record.childId
  440. })
  441. selectionRows.value.splice(delIndex, 1)
  442. }
  443. }
  444. function onSelectAll(selected, selectionRows1, changeRows) {
  445. if (selected) {
  446. selectionRows.value = selectionRows.value.concat(changeRows)
  447. }
  448. if (!selected) {
  449. let selectionRows2 = JSON.parse(JSON.stringify(selectionRows.value))
  450. const delIndex = []
  451. selectionRows2.forEach((item, index) => {
  452. changeRows.forEach((val, itemIndex) => {
  453. if (item.childId === val.childId) {
  454. delIndex.push(index)
  455. }
  456. })
  457. })
  458. delIndex.forEach((item) => {
  459. delete selectionRows2[item]
  460. })
  461. selectionRows2 = selectionRows2.filter((item) => {
  462. return item !== undefined
  463. })
  464. selectionRows.value = selectionRows2
  465. }
  466. }
  467. function handleOk(){
  468. if(fatherType.value=='payRequest'){
  469. emit('selectSaleOrder', selectionRows.value)
  470. handleCancel()
  471. }else{
  472. var arr = [],
  473. arrSupplier=[]
  474. selectionRows.value.map(item=>{
  475. arr.push(item.billCode)
  476. arrSupplier.push(item.supplierId)
  477. })
  478. if(fatherSourceCode.value&&fatherSourceCode.value!==''){
  479. arr.push(fatherSourceCode.value)
  480. }
  481. if(selectedRowKeys.value.length==0){
  482. message.error('请勾选数据');
  483. }else if(new Set(arr).size!==1){
  484. message.error('请勾选订单编号相同的数据');
  485. }else if(new Set(arrSupplier).size!==1){
  486. message.error('请勾选供应商相同的数据');
  487. }else{
  488. emit('selectSaleOrder', selectionRows.value)
  489. handleCancel()
  490. }
  491. }
  492. }
  493. function handleCancel(){
  494. visible.value = false
  495. selectedRowKeys.value = []
  496. selectionRows.value=[]
  497. billDate.value = []
  498. queryParams.value = {
  499. billCode:'',
  500. project:'',
  501. projectName:'',
  502. productionClass:'',
  503. priority:'',
  504. supplierId:'',
  505. supplier:'',
  506. headModel:'',
  507. englishName:'',
  508. productCode:'',
  509. childModel:'',
  510. billDate_begin:'',
  511. billDate_end:'',
  512. saleDepartment:'',
  513. salesman:'',
  514. customer:'',
  515. }
  516. pagination.value.current =1;
  517. pagination.value.pageSize = 10;
  518. }
  519. function getTable(formData,data){
  520. visible.value = true
  521. if(formData.projectName&&formData.projectName!==''){
  522. fatherProject.value = formData.project
  523. }else{
  524. fatherProject.value = ''
  525. }
  526. if(formData.sourceCode&&formData.sourceCode!==''){
  527. fatherSourceCode.value = formData.sourceCode2
  528. }else{
  529. fatherSourceCode.value = ''
  530. }
  531. if(formData.sourceCode&&formData.sourceCode!==''){
  532. fatherSourceCode.value = formData.sourceCode2
  533. }else{
  534. fatherSourceCode.value = ''
  535. }
  536. fatherType.value='other'
  537. // getListUrl.value ='/saleCode/saleOrder/selectSaleOrderDetailAlert'
  538. //发货通知单里使用不显示供应商
  539. if(data=='delivery'){
  540. showCustomer.value = 'yes'
  541. getListUrl.value ='/saleCode/saleOrder/selectSaleOrderDetailAlertDelivery'
  542. columns= columns1.filter(function(value, i) {
  543. return i !== 4;
  544. });
  545. if(formData.customer&&formData.customer!==''){
  546. fatherCustomer.value = formData.customer
  547. }else{
  548. fatherCustomer.value = ''
  549. }
  550. }else if(data=='purOrder'){
  551. showCustomer.value = 'no'
  552. columns= columns1.filter(function(value, i) {
  553. return i !== 5;
  554. });
  555. if(formData.supplierName&&formData.supplierName!==''){
  556. fatherSupplier.value = formData.supplier
  557. }else{
  558. fatherSupplier.value = ''
  559. }
  560. getListUrl.value ='/saleCode/saleOrder/selectSaleOrderDetailAlertExistSup'
  561. }
  562. loadData()
  563. }
  564. function getTableFromSalePayRequestForm(){
  565. visible.value = true
  566. fatherProject.value = ''
  567. fatherSourceCode.value = ''
  568. fatherType.value='payRequest'
  569. showCustomer.value = 'no'
  570. columns= columns1.filter(function(value, i) {
  571. return i !== 4;
  572. });
  573. getListUrl.value ='/saleCode/saleOrder/selectSaleOrderDetailAlert'
  574. loadData()
  575. }
  576. function changeBillDate(prop){
  577. if(prop){
  578. billDate.value = prop
  579. queryParams.value.billDate_begin = prop[0]
  580. queryParams.value.billDate_end = prop[1]
  581. }else{
  582. billDate.value = []
  583. queryParams.value.billDate_begin = ''
  584. queryParams.value.billDate_end = ''
  585. }
  586. }
  587. function changeCustmer(value){
  588. queryParams.value.customer = queryParams.value.customer
  589. fatherCustomer.value=''
  590. }
  591. defineExpose({
  592. getTable,
  593. getTableFromSalePayRequestForm
  594. });
  595. </script>
  596. <style scoped lang="less">
  597. /deep/.ant-form-item{
  598. margin-bottom: 8px !important;
  599. }
  600. // /deep/.ant-table-wrapper .ant-table-thead > tr > th, .ant-table-wrapper .ant-table-thead > tr > td{
  601. // padding: 8px !important;
  602. // }
  603. /deep/.tableHiddle {
  604. display: none;
  605. }
  606. /deep/.tableShow{
  607. display: revert;
  608. }
  609. </style>