Compare commits

...

3 Commits

  1. 1
      .env.prod
  2. 1
      .env.production
  3. 1
      .env.sit
  4. 1
      .env.uat
  5. 1
      .env.ver
  6. 499
      src/components/ApprovalProgressTemplate/indexNew.vue
  7. 6
      src/config/router.config.js
  8. 4
      src/mixins/JeecgListMixin.js
  9. 14
      src/views/excel/ExcelExportTaskList.vue
  10. 13
      src/views/excel/ExcelImportTaskList.vue
  11. 183
      src/views/merger/ProductionOrderConfig/ProductionOrderConfigList.vue
  12. 124
      src/views/merger/ProductionOrderConfig/modules/ProductionOrderConfigListForm.vue
  13. 61
      src/views/merger/ProductionOrderConfig/modules/ProductionOrderConfigListModal.vue
  14. 34
      src/views/merger/mergerapply/MaterialMaster.vue
  15. 19
      src/views/merger/mergerapply/MergerReqs.vue
  16. 39
      src/views/merger/mergerapply/MergerReqsAction.js
  17. 4
      src/views/merger/mergerapply/modules/MaterialMasterModal.vue
  18. 224
      src/views/merger/mergerapply/modules/MaterialMasterModalForm.vue
  19. 31
      src/views/merger/mergerapply/modules/MergerReqsModal.vue
  20. 67
      src/views/merger/mergerapply/modules/MergerReqsModalBody.vue
  21. 3
      src/views/merger/mergerapply/modules/MergerReqsModalBodyForm.vue
  22. 2
      src/views/merger/mergerapply/modules/MergerReqsModalForm.vue
  23. 37
      src/views/merger/mergerapply/modules/devClassifyAttr/config.js
  24. 217
      src/views/merger/mergerapply/modules/devClassifyAttr/index.vue
  25. 59
      src/views/merger/mergerapply/modules/flowListConfig.js
  26. 108
      src/views/merger/mergerapply/modules/flowListDialog.vue
  27. 91
      src/views/merger/mergerapply/modules/materialRemarkDialog.vue
  28. 250
      src/views/merger/mergeredConfig/productClassify/index.vue
  29. 8
      src/views/merger/mergeredConfig/productClassify/modules/CNregulatoryConditions.vue
  30. 182
      src/views/merger/mergeredConfig/productClassify/modules/MergerGoodsForm.vue
  31. 54
      src/views/merger/mergeredConfig/productClassify/modules/ModifyRecordList.vue
  32. 2
      src/views/merger/mergeredConfig/productClassify/modules/ModifyRecordModal.vue
  33. 42
      src/views/merger/mergeredConfig/productClassify/modules/additionCode.js
  34. 158
      src/views/merger/mergeredConfig/productClassify/modules/additionCodeDialog.vue
  35. 66
      src/views/merger/mergeredConfig/productClassify/modules/batchAuditPassDialog.vue
  36. 78
      src/views/merger/mergeredConfig/productClassify/modules/batchAuditUserDialog.vue

1
.env.prod

@ -1,5 +1,6 @@
NODE_ENV=prod
VUE_APP_API_BASE_URL=https://lcapi.midea.com/api-iems-cn/gcs
VUE_APP_API_BASE_DOMAIN=https://lcapi.midea.com
VUE_APP_API_BASE_SITE=https://lcapi.midea.com/api-iems-cn/gcs
VUE_APP_CAS_BASE_URL=https://signin.midea.com/login
VUE_APP_ONLINE_BASE_URL=

1
.env.production

@ -1,5 +1,6 @@
NODE_ENV=production
VUE_APP_API_BASE_URL=https://lcapi.midea.com/api-iems-cn/gcs
VUE_APP_API_BASE_DOMAIN=https://lcapi.midea.com
VUE_APP_API_BASE_SITE=https://lcapi.midea.com/api-iems-cn/gcs
VUE_APP_CAS_BASE_URL=https://signin.midea.com/login
VUE_APP_ONLINE_BASE_URL=

1
.env.sit

@ -1,5 +1,6 @@
NODE_ENV=sit
VUE_APP_API_BASE_URL=https://lsitapi.midea.com/api-iems-cn/gcs
VUE_APP_API_BASE_DOMAIN=https://lsitapi.midea.com
VUE_APP_API_BASE_SITE=http://localhost:9000
VUE_APP_CAS_BASE_URL=https://signinuat.midea.com/login
VUE_APP_ONLINE_BASE_URL=

1
.env.uat

@ -1,5 +1,6 @@
NODE_ENV=uat
VUE_APP_API_BASE_URL=https://luatapi.midea.com/api-iems-cn/gcs
VUE_APP_API_BASE_DOMAIN=https://luatapi.midea.com
VUE_APP_API_BASE_SITE=http://localhost:9000
VUE_APP_CAS_BASE_URL=https://signinuat.midea.com/login
VUE_APP_ONLINE_BASE_URL=

1
.env.ver

@ -1,5 +1,6 @@
NODE_ENV=ver
VUE_APP_API_BASE_URL=https://lverapi.midea.com/api-iems-cn/gcs
VUE_APP_API_BASE_DOMAIN=https://lverapi.midea.com
VUE_APP_API_BASE_SITE=http://localhost:9000
VUE_APP_CAS_BASE_URL=https://signinuat.midea.com/login
VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview

499
src/components/ApprovalProgressTemplate/indexNew.vue

@ -0,0 +1,499 @@
<template>
<j-modal class="approval-new-dialog" :title="title" :width="width" :visible="visible" @cancel="handleCancel"
:footer="null">
<!-- <template slot="footer">
<w-button type="primary" @click="handleCancel">关闭</w-button>
</template> -->
<a-spin :spinning="loading">
<div v-if="type === 'submit'">
<div>
<div class="topArea">
<div class="topArea_box">
<div class="topArea_theme">
<div class="topArea_theme_label">
主题
</div>
<w-input style="width: 300px;" v-model="themeTitle" />
</div>
<div class="buttonArea">
<w-button v-for="item in buttonList" :key="item.name" type="primary" @click="openFlowModal(item)">{{
item.name }}</w-button>
</div>
</div>
</div>
</div>
<div>
<w-tabs v-model="activeKey" type="card" style="width: 100%" size="mini">
<w-tab-pane tab="流程表格" key="flowTable" :forceRender="true">
<a-table ref="table" :columns="submitColumns" :pagination="false" :dataSource="dataSource" bordered
size="middle" row-key="id" class="j-table-force-nowrap">
<span slot="operator" slot-scope="text, record">
<span v-if="record.showType === 'text'">{{ record.handlerNames }} </span>
<!-- <w-input v-else-if="record.showType === 'input'" v-model="operator" /> -->
<AppprovalUserSelect v-model="record.operator" :disabled="record.disabled"
v-else-if="record.showType === 'input'" @change="(data) => getOperator(data, record)" />
<span v-else></span>
</span>
</a-table>
</w-tab-pane>
</w-tabs>
</div>
</div>
<div v-if="type === 'audit'">
<div>
<div class="topArea">
<div class="topArea_box">
<div class="topArea_theme">
<!-- <div class="topArea_theme_label">
主题
</div> -->
<div>
{{ themeTitle }}
</div>
</div>
<div class="buttonArea">
<!-- 遍历 -->
<w-button v-for="(item, index) in buttonList" :key="item.name" :type="index === 0 ? 'primary' : ''"
@click="openFlowModal(item)">{{
item.name }}</w-button>
</div>
</div>
</div>
</div>
<div>
<w-tabs v-model="activeKey" type="card" style="width: 100%" size="mini">
<w-tab-pane tab="审批记录" key="auditRecord" :forceRender="true">
<a-table ref="table" :columns="auditColumns" :pagination="false" :dataSource="dataSource" bordered
size="middle" row-key="id" class="j-table-force-nowrap" />
</w-tab-pane>
<w-tab-pane tab="日志" key="auditLog" :forceRender="true">
<a-table ref="table" :columns="auditColumns" :pagination="false" :dataSource="logList" bordered
size="middle" row-key="id" class="j-table-force-nowrap" />
</w-tab-pane>
</w-tabs>
</div>
</div>
</a-spin>
<passModal ref="passModal" @ok="hanledOK" />
</j-modal>
</template>
<script>
import { postAction } from '@/api/manage';
import passModal from './components/passModal.vue';
import { mapGetters } from 'vuex';
import AppprovalUserSelect from '@/components/AppprovalUserSelect/index';
export default {
name: "ApprovalProgressTemplate",
components: {
passModal,
AppprovalUserSelect
},
data() {
return {
loading: false,
type: 'submit',
activeKey: 'flowTable',
title: "提交",
width: 800,
visible: false,
themeTitle: '',
// id
businessId: '',
// id
flowId: "",
//
operator: "",
operatorName: '',
submitColumns: [
{
title: '序号',
dataIndex: 'nodeId',
key: 'nodeId',
width: 60,
align: 'center',
},
{
title: '节点',
align: 'center',
dataIndex: 'nodeName',
ellipsis: true,
width: 200,
},
{
title: '处理人',
align: 'center',
width: 300,
dataIndex: 'operator',
ellipsis: true,
scopedSlots: { customRender: 'operator' },
},
{
title: '类型',
align: 'center',
dataIndex: 'processType',
ellipsis: true,
},
],
auditColumns: [
{
title: '节点',
align: 'center',
dataIndex: 'fdNodeId',
ellipsis: true,
width: 100,
},
{
title: '节点名称',
align: 'center',
dataIndex: 'fdNodeName',
ellipsis: true,
width: 100,
},
{
title: '操作人',
align: 'center',
width: 100,
dataIndex: 'fdHandlerName',
ellipsis: true,
},
{
title: '操作',
align: 'center',
dataIndex: 'fdOperationName',
ellipsis: true,
width: 100,
},
{
title: '附件/审批意见',
align: 'center',
dataIndex: 'fdAuditeInfo',
ellipsis: true,
width: 200,
},
// {
// title: '',
// align: 'center',
// dataIndex: 'time',
// ellipsis: true,
// width: 100,
// },
],
dataSource: [],
url: {
//
initProcess: '/flow/common/initProcess',
// list
optionList: '/flow/common/optionList',
// list
flowList: '/flow/common/info/table',
//
submit: '/flow/common/submit',
//
approve: '/flow/common/approve',
//
auditeNote: '/flow/common/auditeNote',
//
auditeNoteSupply: '/flow/common/info/process',
//
logList: '/flow/common/log/list',
//
refuseNode: '/flow/common/refuseNode/process',
//
getFdTemplateCodeApi: '/merger/mergerGoods/v1/check-merger-goods-by-id',
},
buttonList: [],
fdActivityType: '',
taskId: "",
nodeInstanceId: '',
refuseNodeList: [],
logList: [],
fdTemplateCode: 'mergerApply'
}
},
methods: {
...mapGetters(['userInfo']),
async getFlowList() {
const res = await postAction(this.url.optionList, {
fdId: this.flowId,
loginName: this.userInfo().username,
});
const resp = await postAction(this.url.flowList, {
fdId: this.flowId,
loginName: this.userInfo().username,
fdTemplateCode: this.fdTemplateCode,
});
if (res.success) {
if (res.result.length) {
this.buttonList = res.result[0].operationList.filter(item => !['沟通', '废弃'].includes(item.name));
this.buttonList = this.buttonList.sort((a, b) => a.order - b.order);
} else {
this.buttonList = [];
}
} else {
this.$message.error(res.message);
this.loading = false;
}
if (resp.success) {
this.dataSource = resp.result.processNodes || [];
this.dataSource.forEach((item) => {
this.$set(item, 'showType', 'text');
if (item.activityType === 'approveNode') {
item.showType = 'input';
item.disabled = !(item.mustSelected || item.canSelected);
item.operator = item.handlers && item.handlers.length ? item.handlers[0].id : this.operator;
}
});
} else {
this.$message.error(res.message);
this.loading = false;
}
setTimeout(() => {
this.loading = false
}, 100);
},
async getLogList() {
const res = await postAction(this.url.optionList, {
fdId: this.flowId,
loginName: this.userInfo().username,
})
if (res.success) {
if (res.result.length) {
this.buttonList = res.result[0].operationList.filter(item => !['沟通', '废弃'].includes(item.name));
this.buttonList = this.buttonList.sort((a, b) => a.order - b.order);
} else {
this.buttonList = [];
}
} else {
this.$message.error(res.message);
this.loading = false;
}
const resp = await postAction(this.url.auditeNote, {
bsId: this.businessId,
fdId: this.flowId,
loginName: this.userInfo().username,
fdTemplateCode: this.fdTemplateCode,
})
const resppp = await postAction(this.url.logList, {
bsId: this.businessId,
fdId: this.flowId,
loginName: this.userInfo().username,
fdTemplateCode: this.fdTemplateCode,
})
this.logList = JSON.parse(resppp.result);
if (resp.success) {
this.dataSource = resp.result;
const response = await postAction(this.url.auditeNoteSupply, {
// bsId: this.businessId,
fdId: this.flowId,
loginName: this.userInfo().username,
fdTemplateCode: this.fdTemplateCode,
})
if (response.result.currNodes && response.result.currNodes.length > 0) {
this.themeTitle = response.result.subject;
this.nodeInstanceId = response.result.currNodes[0].nodeInstanceId;
this.dataSource.push({
fdNodeId: response.result.currNodeIds,
fdNodeName: response.result.currNodes[0].nodeName,
fdHandlerName: response.result.currNodes[0].handlers[0].name,
fdOperationName: response.result.fdStatus,
fdAuditeInfo: response.result.nodeDesc,
})
}
} else {
this.$message.error(res.message);
this.loading = false;
}
setTimeout(() => {
this.loading = false;
}, 100);
},
async openFlowModal(obj) {
this.operationFlag = obj.operationType;
this.taskId = obj.operationTaskList[0].fdTaskId;
this.fdActivityType = obj.operationTaskList[0].fdActivityType;
let title = '';
if (this.operationFlag === 'handler_pass') {
title = '通过';
} else if (this.operationFlag === 'draft_submit') {
title = '提交';
if (!this.operator) {
return this.$message.info('请先选择处理人')
}
} else if (this.operationFlag === 'handler_commission') {
title = '转办';
} else if (this.operationFlag === 'handler_refuse') {
title = '驳回';
const res = await postAction(this.url.refuseNode, {
fdId: this.flowId,
loginName: this.userInfo().username,
nodeInstanceId: this.nodeInstanceId
})
this.refuseNodeList = res.result;
} else if (['draft_abandon', 'handler_abandon'].includes(this.operationFlag)) {
title = '废弃';
} else if (this.operationFlag === 'handler_communicate') {
title = '沟通';
}
this.$refs.passModal.show({
title,
flag: this.operationFlag,
refuseNodeList: this.refuseNodeList
})
},
async show(obj) {
this.type = obj.type;
this.activeKey = this.type === 'submit' ? 'flowTable' : 'auditRecord';
this.businessId = obj.id;
this.visible = true;
this.flowId = obj.flowId;
this.operator = obj.defaultverifyBy || '';
this.fdTemplateCode = obj.mergerApplyFactory || 'mergerApplyFactory';
this.loading = true;
this.themeTitle = obj.title || '';
if (this.type === 'submit') {
if (this.flowId) {
this.getFlowList();
} else {
const res = await postAction(this.url.initProcess, {
fdTemplateCode: this.fdTemplateCode,
loginName: this.userInfo().username,
id: this.businessId
})
if (res.success) {
this.flowId = res.result;
this.getFlowList();
} else {
this.$message.error(res.message);
this.loading = false;
}
}
} else {
this.title = '审核';
this.flowId = obj.flowId;
this.getLogList();
}
},
handleCancel() {
this.visible = false;
this.operator = '';
},
getOperator(data, row) {
if (data && data.length > 0) {
row.operatorName = data[0].userName;
} else {
row.operatorName = '';
}
},
async hanledOK(obj) {
//
if (this.operationFlag === 'draft_submit') {
let fdUrl = '';
if (this.fdTemplateCode === 'mergerApplyFactory') {
const env = process.env.NODE_ENV === 'prod' ? '' : process.env.NODE_ENV;
fdUrl = `https://gcs${env ? String(env).toLocaleLowerCase() : ''}.midea.com/#/iflowPage/classifyFactoryApproval`;
// fdUrl = `https://gcssit.midea.com/#/iflowPage/classifyFactoryApproval`;
}
const nodeList = this.dataSource.filter(item => item.activityType === 'approveNode');
const res = await postAction(this.url.submit, {
bsId: this.businessId,
loginName: this.userInfo().username,
docSubject: this.themeTitle,
fdId: this.flowId,
fdTemplateCode: this.fdTemplateCode,
auditNote: obj.remark,
processParam: {
changeNodeHandler: nodeList.map(i => {
return {
nodeId: i.nodeId,
handlers: [
{
type: "USER",
id: i.operator,
name: i.operatorName
}
]
}
}),
taskId: this.taskId,
activityType: this.fdActivityType,
operationType: this.operationFlag,
},
formParam: {
formInstanceId: this.businessId,
fdUrl: fdUrl
}
})
if (res.success) {
this.$refs.passModal.handleCancel();
this.$refs.passModal.remark = '';
this.visible = false;
this.$refs.passModal.loading = false;
this.$emit('ok');
} else {
this.$refs.passModal.loading = false;
this.$message.error(res.message);
}
}
//
else {
const res = await postAction(this.url.approve, {
fdId: this.flowId,
auditNote: obj.remark,
fdTemplateCode: this.fdTemplateCode,
bsId: this.businessId,
loginName: this.userInfo().username,
processParam: {
jumpToNodeId: obj.node,
refusePassedToThisNode: obj.refusePassedToThisNode,
refusePassedToAllApprover: obj.refusePassedToAllApprover,
toOtherPersons: this.operationFlag === 'handler_commission' ? obj.operator : '',
toOtherPersonsName: this.operationFlag === 'handler_commission' ? obj.operatorName : '',
changeNodeHandler: [],
taskId: this.taskId,
activityType: this.fdActivityType,
operationType: this.operationFlag,
}
})
if (res.success) {
this.$refs.passModal.handleCancel();
this.$refs.passModal.remark = '';
this.visible = false;
this.$refs.passModal.loading = false;
this.$emit('ok');
} else {
this.$message.error(res.message);
this.$refs.passModal.loading = false;
}
}
this.operator = '';
}
}
}
</script>
<style lang="less">
.approval-new-dialog {
.topArea {
.topArea_box {
.topArea_theme {
display: flex;
align-items: center;
margin-bottom: 20px;
.topArea_theme_label {
margin-right: 20px;
}
}
.buttonArea {
margin-bottom: 20px;
}
}
}
}
</style>

6
src/config/router.config.js

@ -388,6 +388,12 @@ export const asyncRouterMap = [
component: () => import('@/views/merger/mergerapply/MergerTimeValidity'),
meta: { title: '归类时效配置', permission: 438 },
},
{
name: 'ProductionOrderConfigList',
path: 'ProductionOrderConfigList',
component: () => import('@/views/merger/ProductionOrderConfig/ProductionOrderConfigList'),
meta: { title: '生产单归类规则配置', permission: 438 },
},
{
name: 'MergerReqs',
path: '/merger/mergerapply/MergerReqs',

4
src/mixins/JeecgListMixin.js

@ -549,11 +549,11 @@ export const JeecgListMixin = {
this.$router.push(record);
},
//子组件edit、add方法最后执行,可在子组件中重新自定义title、disableSubmit属性
handleEdit: function (record) {
handleEdit: function (record,customParams = {}) {
this.visible = false;
this.$refs.modalForm.title = '编辑';
this.$refs.modalForm.disableSubmit = false;
this.$refs.modalForm.edit(record);
this.$refs.modalForm.edit(record,customParams);
},
handleAdd: function () {
this.visible = false;

14
src/views/excel/ExcelExportTaskList.vue

@ -60,8 +60,6 @@
</a-menu>
<w-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></w-button>
</a-dropdown> -->
<w-button @click="execute()" v-has="'excel:export:execute'" type="primary"> 导出执行 </w-button>
</div>
<!-- table区域-begin -->
@ -106,7 +104,6 @@
import { JeecgListMixin, WGridResizeByCssMixin } from '@/mixins/JeecgListMixin'
import { mixinDevice } from '@/utils/mixin'
import { getAction } from '@/api/manage'
import ExcelExportModel from './modules/ExcelExportModel.vue'
export default {
name: 'ExcelExportTaskList',
@ -257,7 +254,6 @@ export default {
delete: '/sys/excel/export/task/delete',
deleteBatch: '/sys/excel/export/task/deleteBatch',
downloadUrl: '/sys/excel/download',
executeExportTask: '/sys/excel/export/task/executeExportTask',
},
dictOptions: {},
superFieldList: [],
@ -290,16 +286,6 @@ export default {
this.createTime = []
this.searchReset()
},
execute() {
getAction(this.url.executeExportTask).then((res) => {
if (res.success) {
this.$message.success('导出执行成功')
this.loadData(1)
} else {
this.$message.warning(res.message)
}
})
},
},
}
</script>

13
src/views/excel/ExcelImportTaskList.vue

@ -43,7 +43,6 @@
<!-- 操作按钮区域 -->
<div class="table-operator">
<w-button @click="execute()" v-has="'excel:import:execute'" type="primary"> 导入执行 </w-button>
</div>
<!-- table区域-begin -->
@ -94,7 +93,6 @@
import { JeecgListMixin, WGridResizeByCssMixin } from '@/mixins/JeecgListMixin'
import { mixinDevice } from '@/utils/mixin'
import ExcelImportTaskModal from './modules/ExcelImportTaskModal'
import { getAction } from '@/api/manage'
export default {
name: 'ExcelImportTaskList',
@ -255,7 +253,6 @@ export default {
exportXlsUrl: '/sys/excel/import/task/exportXls',
importExcelUrl: '/sys/excel/import/task/importExcel',
downloadUrl: '/sys/excel/download',
executeImportTask: '/sys/excel/import/task/executeImportTask',
},
dictOptions: {},
superFieldList: [],
@ -288,16 +285,6 @@ export default {
this.createTime = []
this.searchReset()
},
execute() {
getAction(this.url.executeImportTask).then((res) => {
if (res.success) {
this.$message.success('导入执行成功')
this.loadData(1)
} else {
this.$message.warning(res.message)
}
})
},
},
}
</script>

183
src/views/merger/ProductionOrderConfig/ProductionOrderConfigList.vue

@ -0,0 +1,183 @@
<template>
<w-card>
<div>
<!-- 查询区域 -->
<div class="table-page-search-wrapper" v-has="'ProductionOrderConfig:query'">
<w-form layout="inline" @keyup.enter.native="searchQuery">
<w-row :gutter="10">
<w-col :xl="5" :lg="5" :md="8" :sm="24">
<j-dict-select-tag
v-model="queryParam.type"
dict-code="MergerProduceConfigType"
placeholder="请选择类型"
/>
</w-col>
<w-col :xl="5" :lg="5" :md="8" :sm="24">
<w-input v-model="queryParam.content" placeholder="请输入产品名称或研发分类" />
</w-col>
<w-col :xl="5" :lg="5" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<w-button type="primary" @click="searchQuery" icon="search">搜索</w-button>
<w-button type="primary" @click="searchReset">重置</w-button>
<j-super-query :fieldList="refColumns" ref="superQueryModal" @handleSuperQuery="handleSuperQuery" />
</span>
</w-col>
<div v-has="'ProductionOrderConfig:export'" class="leftArea">
<div class="filterBox">
<span class="iconfont icon-download-2" @click="exportExcel()"></span>
</div>
</div>
</w-row>
</w-form>
</div>
<!-- 查询区域-END -->
<!-- 操作按钮区域 -->
<div class="table-operator">
<w-button @click="handleAdd" type="primary" v-has="'ProductionOrderConfig:add'">新增</w-button>
<w-button @click="importModel" type="primary" v-has="'ProductionOrderConfig:import'"> 导入 </w-button>
</div>
<!-- table区域-begin -->
<div>
<w-fit-container elementType="grid" :fitSize="180">
<a-table
:id="refColumnsKey"
ref="table"
size="middle"
:scroll="getTableScroll(1200)"
bordered
rowKey="id"
:columns="refColumns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:customHeaderRow="customHeaderRow"
:rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
class="j-table-force-nowrap"
@change="handleTableChange"
:components="resizableComponents"
:customRow="selectRow"
>
<span slot="action" slot-scope="text, record">
<a @click="handleEdit(record)" v-has="'ProductionOrderConfig:edit'">编辑</a>
<span v-has="'ProductionOrderConfig:del'">
<w-divider type="vertical" />
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
<a>删除</a>
</a-popconfirm>
</span>
</span>
</a-table>
</w-fit-container>
</div>
</div>
<w-table-columns-win @columnsChange="columnsChange" @resetColumns="resetColumns" ref="choose" :columns="columns" />
<ProductionOrderConfigListModal ref="modalForm" @ok="modalFormOk" @close="modalFormClose" />
<excel-export-model ref="excelExport" />
<excel-import-model ref="importModel" />
</w-card>
</template>
<script>
import { mixinDevice } from '@/utils/mixin';
import { JeecgListMixin, WGridResizeByCssMixin } from '@/mixins/JeecgListMixin';
import ProductionOrderConfigListModal from './modules/ProductionOrderConfigListModal';
import ExcelExportModel from '@/views/excel/modules/ExcelExportModel';
import ExcelImportModel from '@/views/excel/modules/ExcelImportModel.vue';
import { getAction } from '@/api/manage';
export default {
//
name: 'ProductionOrderConfigList',
mixins: [JeecgListMixin, mixinDevice, WGridResizeByCssMixin],
components: {
ProductionOrderConfigListModal,
ExcelExportModel,
ExcelImportModel,
},
data() {
return {
//
columns: [
{
title: '#',
dataIndex: '',
key: 'rowIndex',
width: 60,
ellipsis: true,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1;
},
},
{
title: '类型',
align: 'center',
width: 200,
ellipsis: true,
dataIndex: 'type_dictText',
},
{
title: '产品名称或研发分类',
align: 'center',
width: 200,
ellipsis: true,
dataIndex: 'content',
},
{
title: '备注',
align: 'center',
width: 300,
ellipsis: true,
dataIndex: 'remark',
},
{
title: '操作',
dataIndex: 'action',
align: 'center',
width: 147,
ellipsis: true,
fixed: 'right',
scopedSlots: { customRender: 'action' },
},
],
url: {
list: '/merger/merger-produce-config/v1/get-merger-produce-config-by-page',
del: '/merger/merger-produce-config/v1/del',
importEleExcelUrl: '/merger/merger-produce-config/v1/import-excel',
exportXlsUrl: '/merger/merger-produce-config/v1/export-xls',
},
};
},
methods: {
/* 表头的导出 */
exportExcel() {
const para = this.getQueryParams();
para.ids = this.selectedRowKeys;
this.$refs.excelExport.show(this.url.exportXlsUrl, para, this.refColumns, 'MERGER_PRODUCE_CONFIG');
},
/* 导入 */
importModel() {
this.$refs.importModel.show(this.url.importEleExcelUrl, 'MERGER_PRODUCE_CONFIG', {});
},
handleDelete: function (id) {
const that = this;
getAction(that.url.del, { id: id }).then((res) => {
if (res.success) {
//
that.reCalculatePage(1);
that.$message.success(res.message);
that.loadData();
} else {
that.$message.warning(res.message);
}
});
},
},
};
</script>

124
src/views/merger/ProductionOrderConfig/modules/ProductionOrderConfigListForm.vue

@ -0,0 +1,124 @@
<template>
<a-spin :spinning="confirmLoading">
<j-form-container :disabled="formDisabled">
<w-form ref="form" :model="formData" :rules="validatorRules" slot="detail">
<w-row>
<w-col :span="24">
<w-form-item label="类型" prop="type">
<j-dict-select-tag
v-model="formData.type"
dict-code="MergerProduceConfigType"
placeholder="请选择类型"
v-required-color="true"
/>
</w-form-item>
</w-col>
<w-col :span="24">
<w-form-item label="产品名称或研发分类" prop="content">
<w-input
v-model="formData.content"
placeholder="请输入产品名称或研发分类"
:maxLength="500"
v-required-color="true"
/>
</w-form-item>
</w-col>
<w-col :span="24">
<w-form-item label="备注" prop="remark">
<w-input v-model="formData.remark" placeholder="请输入备注" :maxLength="100" />
</w-form-item>
</w-col>
</w-row>
</w-form>
</j-form-container>
</a-spin>
</template>
<script>
import { httpAction, getAction } from '@/api/manage';
export default {
name: 'ProductionOrderConfigListForm',
components: {},
props: {
//
disabled: {
type: Boolean,
default: false,
required: false,
},
},
data() {
return {
formData: {},
confirmLoading: false,
validatorRules: {
type: [{ required: true, message: '类型!' }],
content: [{ required: true, message: '产品名称或研发分类!' }],
},
url: {
add: '/merger/merger-produce-config/v1/add',
update: '/merger/merger-produce-config/v1/update',
queryById: '/merger/merger-produce-config/v1/get-by-id',
},
};
},
computed: {
formDisabled() {
return this.disabled;
},
},
created() {
//formData
this.modelDefault = JSON.parse(JSON.stringify(this.formData));
},
methods: {
add() {
this.edit(this.modelDefault);
},
edit(record) {
this.getRecord(record.id);
},
submitForm() {
this.$refs.form.validate((valid) => {
if (valid) {
this.confirmLoading = true;
const httpurl = this.formData.id ? this.url.update : this.url.add;
httpAction(httpurl, this.formData, 'post')
.then((res) => {
if (res.success) {
this.$message.success(res.message);
this.$emit('ok');
} else {
this.$message.error(res.message);
}
})
.finally(() => {
this.confirmLoading = false;
});
}
});
},
async getRecord(id) {
if (!id) {
return;
}
this.confirmLoading = true;
const res = await getAction(this.url.queryById, { id });
if (res.success && res.result) {
this.$set(this, 'formData', res.result);
} else {
this.$message.error(res.message);
}
this.confirmLoading = false;
},
compNoChange(obj) {
this.formData.compName = obj ? obj.name : '';
this.formData.tenantId = obj ? obj.id : '';
},
},
};
</script>

61
src/views/merger/ProductionOrderConfig/modules/ProductionOrderConfigListModal.vue

@ -0,0 +1,61 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
switchFullscreen
@ok="handleOk"
:okButtonProps="{ class: { 'jee-hidden': disableSubmit } }"
@cancel="handleCancel"
cancelText="关闭"
>
<ProductionOrderConfigListForm ref="realForm" @ok="submitCallback" :disabled="disableSubmit" @close="close" />
</j-modal>
</template>
<script>
import ProductionOrderConfigListForm from './ProductionOrderConfigListForm';
export default {
name: 'ProductionOrderConfigListModal',
components: {
ProductionOrderConfigListForm,
},
data() {
return {
title: '',
width: 800,
visible: false,
disableSubmit: false,
};
},
methods: {
add() {
this.visible = true;
this.$nextTick(() => {
this.$refs.realForm.add();
});
},
edit(record) {
this.visible = true;
this.$nextTick(() => {
this.$refs.realForm.edit(record);
});
},
close() {
this.$emit('close');
this.visible = false;
},
handleOk() {
this.$refs.realForm.submitForm();
},
submitCallback() {
this.$emit('ok');
this.visible = false;
},
handleCancel() {
this.close();
},
},
};
</script>

34
src/views/merger/mergerapply/MaterialMaster.vue

@ -70,6 +70,8 @@
<w-button @click="handleConfirm" v-has="'MaterialMaster:confirm'" type="primary"> 确认 </w-button>
<w-button @click="handleElemImport" v-has="'MaterialMaster:elemImport'" type="primary"> 申报要素导入 </w-button>
<w-button @click="handleElemExport" v-has="'MaterialMaster:elemExport'" type="primary"> 申报要素导出 </w-button>
<w-button @click="handleMaterialImport" v-has="'MaterialMaster:import'" type="primary"> 企业物料导入 </w-button>
<w-button @click="handleMaterialDel" :loading="loading" v-has="'MaterialMaster:del'" type="primary"> 删除 </w-button>
<!-- <w-button @click="batchDel" type="danger" v-has="'MaterialMaster:del'">删除</w-button> -->
</div>
@ -478,6 +480,8 @@ export default {
//
elemExportXlsUrl: '/merger/mergerMaterialMaster/elementExportXls',
elemImportExcelUrl: '/merger/mergerMaterialMaster/elementImportExcel',
materialImportExcelUrl: '/merger/mergerMaterialMaster/v1/importExcel',
materialDelUrl: '/merger/mergerMaterialMaster/v1/batchDelete',
},
// popover
popoverContent: {},
@ -492,7 +496,7 @@ export default {
//
if (this.$route.query?.id) {
this.$nextTick(() => {
this.handleEdit({ id: this.$route.query.id });
this.handleEdit({ id: this.$route.query.id }, { isFromMip: true });
});
}
this.queryParam = {
@ -669,6 +673,34 @@ export default {
// headId: this.head.id
});
},
handleMaterialImport() {
this.$refs.importModel.show(this.url.materialImportExcelUrl, 'MATERIAL_MASTER_IMPORT', {});
},
handleMaterialDel() {
if (this.selectedRowKeys.length === 0) {
this.$message.warning('请至少选择一条数据进行操作!');
return;
}
const that = this;
this.$confirm({
content: '确认删除选中的数据吗?',
onOk: function () {
that.loading = true;
postAction(that.url.materialDelUrl, that.selectedRowKeys)
.then((res) => {
if (res.success) {
that.$message.success(res.message ? res.message : '删除成功!');
that.loadData();
} else {
that.$message.warning(res.message);
}
})
.finally(() => {
that.loading = false;
});
}
});
},
/* 申报要素导出 */
handleElemExport() {
this.hiddenColumns = true;

19
src/views/merger/mergerapply/MergerReqs.vue

@ -85,9 +85,6 @@
<w-button v-has="'MergerReqs:import'" type="primary" @click="importModel"> 要素批量导入 </w-button>
<w-button v-has="'MergerReqs:eleExport'" type="primary" @click="exportEleModel"> 要素批量导出 </w-button>
<w-button v-has="'MergerReqs:transfer'" type="primary" @click="handleTransfer"> 转派 </w-button>
<!-- <w-button @click="handleGrouping" v-has="'MergerReqs:group'" type="primary"> 提交归类 </w-button> -->
<!-- <w-button @click="batchDel" type="danger" v-has="'MergerReqs:del'">删除</w-button> -->
</div>
<!-- table区域-begin -->
@ -173,6 +170,7 @@ import { filterDictTextByFormatCache, initeCusDictItemsFrom } from '@comp/dict/J
import MergerReqsModal from './modules/MergerReqsModal.vue';
import MergerReqsModalTransfer from './modules/MergerReqsModalTransfer.vue';
import AppprovalUserSelect from '@/components/AppprovalUserSelect/index';
import { submitClassify } from './MergerReqsAction';
import { mapGetters } from 'vuex';
export default {
@ -559,30 +557,19 @@ export default {
},
/* 提交归类 */
handleGrouping(record) {
// if (this.selectedRowKeys.length === 0) {
// this.$message.warning('')
// return
// }
const that = this;
that.$confirm({
content: '是否确认提交归类?',
onOk: function () {
that.loading = true;
getAction(that.url.submitMerge, { ids: record.id })
.then((res) => {
submitClassify(that, { id: record.id }).then(res => {
if (res.success) {
that.$message.success(res.message);
that.loadData();
} else {
that.$message.warning(res.message);
}
})
.finally(() => {
}).finally(() => {
that.loading = false;
});
},
});
},
/* 归类驳回 */
handleRejectGrouping(record) {
const that = this;

39
src/views/merger/mergerapply/MergerReqsAction.js

@ -0,0 +1,39 @@
import { postAction } from '@/api/manage';
import lodash from 'lodash';
export const submitClassify = (that, params) => {
return new Promise((resolve, reject) => {
that.$confirm({
content: '是否确认提交归类?',
onOk: function () {
postAction('/merger/mergerReqsHead/submitMergeAndSplitOrder', { ...params, splitFlag: 0 }).then((res) => {
if (res.success) {
if (!lodash.isEmpty(res.result)) {
that.$confirm({
content: '是否拆分需求单,并提交已维护完整的料号?',
onOk: function () {
postAction('/merger/mergerReqsHead/submitMergeAndSplitOrder', { ...params, splitFlag: 1 }).then((resData) => {
resolve(resData);
})
},
onCancel: function () {
reject();
}
});
} else {
resolve(res);
}
} else {
that.$message.warning(res.message);
reject();
}
}).catch(() => {
reject();
})
},
onCancel: function () {
reject();
}
});
});
};

4
src/views/merger/mergerapply/modules/MaterialMasterModal.vue

@ -34,11 +34,11 @@ export default {
this.$refs.realForm.add()
})
},
edit (record) {
edit (record,customParams) {
this.modalVisible = true
this.head = record
this.$nextTick(() => {
this.$refs.realForm.edit(record)
this.$refs.realForm.edit(record,customParams)
})
},
submitForm () {

224
src/views/merger/mergerapply/modules/MaterialMasterModalForm.vue

@ -3,6 +3,7 @@
<w-col class="col-left">
<div class="table-operator">
<w-button @click="submitForm" v-has="'MaterialMaster:save'" type="primary"> 保存 </w-button>
<w-button @click="handleCollect" :disabled="collectDisable" v-has="'MaterialMasterDetails:collect'" type="primary"> 要素采集 </w-button>
<w-button
@click="elementComplete()"
v-has="'MaterialMaster:elemComplete'"
@ -67,9 +68,10 @@
<w-input v-model="model.materialName" disabled />
</w-form-item>
</w-col>
<w-col :span="12">
<w-col :span="12" class="wrap-box">
<md-checkbox v-show="!isFromMip" class="check-box check-box-short" v-model="checkFlagObj.erpUnitCheckFlag"></md-checkbox>
<w-form-item label="ERP单位" prop="erpUnit">
<w-input v-model="model.erpUnit" disabled />
<w-input v-model="model.erpUnit" @change="getDictData()" :disabled="materialDisabled(true, checkFlagObj.erpUnitCheckFlag)" />
</w-form-item>
</w-col>
@ -87,8 +89,8 @@
<w-col :span="12">
<w-form-item :required="model.taxChange === '1'" label="商品编码" prop="codeTs">
<template slot="suffix" v-if="model.newCodeTs && model.newCodeTs !== model.codeTs">
<w-tooltip :content="'新商品编码:' + model.newCodeTs" placement="top" effect="light">
<template slot="suffix" v-if="model.oldCodeTs && model.oldCodeTs !== model.codeTs">
<w-tooltip :content="'旧商品编码:' + model.oldCodeTs" placement="top" effect="light">
商品编码 <i class="md-icon-warning-outline"></i>
</w-tooltip>
</template>
@ -116,8 +118,8 @@
</w-col>
<w-col :span="12">
<w-form-item label="商品名称" prop="gname">
<template slot="suffix" v-if="model.newCodeTs && model.newCodeTs !== model.codeTs">
<w-tooltip :content="'新商品名称:' + model.newGname" placement="top" effect="light">
<template slot="suffix" v-if="model.oldCodeTs && model.oldCodeTs !== model.codeTs">
<w-tooltip :content="'旧商品名称:' + model.oldGname" placement="top" effect="light">
商品名称 <i class="md-icon-warning-outline"></i>
</w-tooltip>
</template>
@ -134,22 +136,22 @@
<j-search-select-tag
v-model="model.unit"
v-required-color="model.status !== '010'"
:page-size="20"
:async="true"
:page-size="999"
placeholder="请选择报关成交单位"
@getselectedObj="unitChange"
:disabled="loginUserRqualNeedPeopleDisabled()"
dict="cus_unit,code_name,code_value"
:dictOptions="unitDictData"
/>
</w-form-item>
</w-col>
<w-col :span="12">
<w-col :span="12" class="wrap-box">
<md-checkbox v-show="!isFromMip" class="check-box" v-model="checkFlagObj.unitConversionFactorCheckFlag"></md-checkbox>
<w-form-item label="单位转换因子" prop="unitConversionFactor">
<w-input
v-model="model.unitConversionFactor"
v-required-color="true"
maxlength="9"
:disabled="loginUserRqualNeedPeopleDisabled()"
:disabled="materialDisabled(loginUserRqualNeedPeopleDisabled(),checkFlagObj.unitConversionFactorCheckFlag)"
@input="handleInputNumber('unitConversionFactor', $event)"
/>
</w-form-item>
@ -167,12 +169,13 @@
/>
</w-form-item>
</w-col>
<w-col :span="12">
<w-col :span="12" class="wrap-box">
<md-checkbox v-show="!isFromMip" v-if="model.unit1 && model.unit1 !== '035'" class="check-box" v-model="checkFlagObj.unit1ConversionFactorCheckFlag"></md-checkbox>
<w-form-item label="法一转换因子" prop="unit1ConversionFactor">
<w-input
v-model="model.unit1ConversionFactor"
maxlength="9"
:disabled="loginUserRqualNeedPeopleDisabled()"
maxlength="10"
:disabled="materialDisabled( model.unit1 === '035' || loginUserRqualNeedPeopleDisabled(),checkFlagObj.unit1ConversionFactorCheckFlag)"
@input="handleInputNumber('unit1ConversionFactor', $event)"
/>
</w-form-item>
@ -189,13 +192,15 @@
/>
</w-form-item>
</w-col>
<w-col :span="12">
<w-form-item label="法二转换因子" prop="unit2ConversionFactor">
<w-col :span="12" class="wrap-box">
<md-checkbox v-show="!isFromMip" v-if="model.unit2 && model.unit2 !== '035'" class="check-box" v-model="checkFlagObj.unit2ConversionFactorCheckFlag"></md-checkbox>
<w-form-item label="法二转换因子" prop="unit2ConversionFactor" :rules="unit2ConversionFactorRules()">
<w-input
maxlength="10"
v-model="model.unit2ConversionFactor"
:disabled="!model.unit2 || loginUserRqualNeedPeopleDisabled()"
maxlength="9"
:disabled="materialDisabled(!model.unit2 || model.unit2 === '035' || loginUserRqualNeedPeopleDisabled(), checkFlagObj.unit2ConversionFactorCheckFlag)"
@input="handleInputNumber('unit2ConversionFactor', $event)"
@blur="handleBlur('unit2ConversionFactor', $event)"
/>
</w-form-item>
</w-col>
@ -285,6 +290,7 @@
</j-form-container>
</w-col>
<w-col class="col-right">
<dev-classify-attr ref="devClassifyAttrRef"></dev-classify-attr>
<div class="productInformation">
<div class="smallTitle">商品描述</div>
<div class="smallInfo" :title="productInfo.gname">{{ productInfo.gname || '' }}</div>
@ -304,6 +310,9 @@
:columns="elementColumns"
:pagination="false"
:data-source="elementDataSource"
:row-selection="!isFromMip ? { selectedRowKeys: selectedRowKeys, onChange: onSelectChange } : null"
@change="handleTableChange"
:custom-row="selectRow"
bordered
size="middle"
row-key="id"
@ -315,7 +324,7 @@
v-if="record.elemType === '1'"
v-model="record.elemValue"
clearable
:disabled="elementAndNeedPeopleDisabled(record)"
:disabled="elementDisabled(record)"
class="right-select"
:inputtranslatevalue="record.elemValue"
>
@ -332,7 +341,7 @@
v-model="record.elemValue"
@blur="changeElementValue"
@change="changeElementValue"
:disabled="elementAndNeedPeopleDisabled(record)"
:disabled="elementDisabled(record)"
:filterOption="filterOption"
:dataSource="record.elemContent.split('|')"
:inputtranslatevalue="record.elemValue"
@ -343,7 +352,7 @@
v-else
v-model="record.elemValue"
@change="changeElementValue"
:disabled="elementAndNeedPeopleDisabled(record)"
:disabled="elementDisabled(record)"
/>
</span>
</a-table>
@ -367,12 +376,13 @@
<div class="smallTitle">其他法人归类</div>
<MergerOtherLegalPerson ref="MergerOtherLegalPerson" @otherLegalRowData="otherLegalRowData" />
</div>
<material-remark-dialog ref="materialRemarkDialogRef" @ok="queryByIdData(model.id)"></material-remark-dialog>
<CNhSCodeModal ref="CNhSCodeModal" :c-nh-s-code-modal-show="CNhSCodeModalShow" @close="closeModal" />
</a-spin>
</template>
<script>
import { getAction, httpAction } from '@/api/manage';
import { getAction, httpAction, postAction } from '@/api/manage';
import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin';
import { JeecgListMixin } from '@/mixins/JeecgListMixin';
import MaterialMasterModalWorkflow from './MaterialMasterModalWorkflow';
@ -382,10 +392,15 @@ import MaterialMasterModalHisList from './MaterialMasterModalHisList';
import MergerOtherLegalPerson from './MergerOtherLegalPerson';
import MaterialMasterModalCertTable from './MaterialMasterModalCertTable';
import AppprovalUserSelect from '@/components/AppprovalUserSelect/index';
import devClassifyAttr from './devClassifyAttr/index.vue';
import materialRemarkDialog from './materialRemarkDialog.vue';
import lodash from 'lodash'
export default {
name: 'MaterialMasterModalForm',
components: {
materialRemarkDialog,
devClassifyAttr,
MaterialMasterModalWorkflow,
MaterialMasterModalHisList,
MergerOtherLegalPerson,
@ -404,6 +419,14 @@ export default {
},
data() {
return {
isFromMip: false, // mip
//
checkFlagObj: {
erpUnitCheckFlag: false,
unitConversionFactorCheckFlag: false,
unit1ConversionFactorCheckFlag: false,
unit2ConversionFactorCheckFlag: false,
},
model: {},
confirmLoading: false,
validatorRules: {
@ -433,15 +456,7 @@ export default {
],
gname: [{ required: true, message: '请输入商品名称!' }],
unit: [
{
validator: (rule, value, callback) => {
if (this.model.status !== '010' && !value) {
callback(new Error('报关成交单位!'));
} else {
callback();
}
},
},
{ required: true, message: '请选择报关成交单位!' }
],
unitConversionFactor: [{ required: true, message: '请输入单位转换因子!' }],
gmodel: [{ required: true, message: '请输入规格型号!' }],
@ -502,12 +517,16 @@ export default {
columns: [],
//
productInfo: {},
unitDictData: []
};
},
computed: {
formDisabled() {
return this.disabled;
},
collectDisable() {
return !(this.model.status === '000' || this.model.status === '020');
}
},
methods: {
...mapGetters(['userInfo']),
@ -552,7 +571,12 @@ export default {
add() {
this.model = Object.assign({});
},
async edit(record) {
async edit(record,customParams) {
if (!lodash.isEmpty(customParams)) {
this.isFromMip = customParams.isFromMip || false;
} else {
this.isFromMip = false;
}
await this.queryByIdData(record.id);
if (this.model.id) {
this.$refs.MergerOtherLegalPerson.extQueryParam.copImgNo = this.model.copImgNo;
@ -560,6 +584,16 @@ export default {
this.$refs.MergerOtherLegalPerson.extQueryParam.id = this.model.id;
this.$refs.MergerOtherLegalPerson.loadData();
}
this.getDictData();
},
setCheckValue(record) {
if (record) {
Object.keys(this.checkFlagObj).forEach(key=>{
if(record.tickMaterial && record.tickMaterial.includes(key)){
this.checkFlagObj[key] = true;
}
});
}
},
/* 要素采集完成 */
elementComplete() {
@ -586,7 +620,7 @@ export default {
.then((res) => {
if (res.success) {
that.$message.success('要素采集完成');
that.edit(that.model);
that.edit(that.model, { isFromMip: that.isFromMip });
// that.model = res.result || that.model
} else {
that.$message.warning(res.message);
@ -653,10 +687,22 @@ export default {
id,
});
if (res.success) {
const oldCodeTs = res.result.codeTs;
const oldGname = res.result.gname;
this.$set(this, 'model', res.result);
if (res.result.taxChange === '1') {
//
this.$set(this.model, 'codeTs', res.result.newCodeTs);
this.$set(this.model, 'gname', res.result.newGname);
//
this.$set(this.model, 'oldCodeTs', oldCodeTs);
this.$set(this.model, 'oldGname', oldGname);
}
if (this.model.codeTs) {
this.queryByIdHscode('detail');
}
this.$refs.devClassifyAttrRef.show(id);
this.setCheckValue(this.model);
}
},
@ -672,6 +718,7 @@ export default {
});
if (res.success) {
this.elementDataSource = res.result.elementsList;
this.setElementCheck();
if (flag === 'detail') {
if (this.model.gmodel) {
this.changeGmodel();
@ -695,12 +742,28 @@ export default {
this.$message.warning(res.message);
}
},
setElementCheck() {
if(this.model && this.model.tickElement){
this.elementDataSource.forEach((element,index) => {
if (this.model.tickElement.includes(element.elemName)) {
this.selectedRowKeys.push(index);
this.selectionRows.push(element);
//
element.canEdit = true;
}
});
}
},
/* 当前登录用户==需求人时,表单和涉证类型不可操作 */
loginUserRqualNeedPeopleDisabled() {
return this.userInfo().username === this.model.demanderId;
},
/* 当前登录用户==需求人时,申报要素中的...禁用 */
elementAndNeedPeopleDisabled(record) {
// mipdisabled
if(this.isFromMip){
return true;
}
const SPECIAL_ELEMENTS = ['品牌类型', '出口享惠情况', 'GTIN', 'CAS', '规格型号'];
return SPECIAL_ELEMENTS.includes(record.elemName) && this.userInfo().username === this.model.demanderId;
},
@ -800,6 +863,88 @@ export default {
const value = e.replace(/[^\d]/g, '');
this.model.codeTs = value;
},
unit2ConversionFactorRules() {
if (this.model.unit2 && this.model.unit2 !== '035') {
return [
{ required: true, message: '请输入法二转换因子!' },
{ pattern: /^[\d]{0,7}([.][0-9]{0,2})?$/g, message: '整数不能超过7位,小数不能超过2位', trigger: 'blur' }
];
} else {
return [];
}
},
handleBlur(field) {
const pattern = /^[\d]{0,7}([.][0-9]{0,2})?$/;
if(field === 'unit2ConversionFactor' && this.model.unit2ConversionFactor){
if(!pattern.test(this.model.unit2ConversionFactor)){
this.$message.warning('整数不能超过7位,小数不能超过2位');
}
}
},
handleCollect() {
if (this.selectionRows.length === 0) {
this.$message.warning('申报要素勾选项不能为空!');
return;
}
// ,;
if (this.model.unit2 && !this.checkFlagObj.unit2ConversionFactorCheckFlag && !this.model.unit2ConversionFactor) {
this.$message.warning('法二转换因子不能为空!');
return;
}
const modelCheck = [];
//
this.model.tickElement = this.selectionRows.map((item) => item.elemName).join('|');
//
Object.keys(this.checkFlagObj).forEach(key=>{
if(this.checkFlagObj[key]){
modelCheck.push(key)
}
});
this.model.tickMaterial = modelCheck.join('|');
this.$refs.materialRemarkDialogRef.show(this.model);
},
// mip
elementDisabled(row) {
if(this.isFromMip){
return !row.canEdit;
}
return false;
},
// mipmip
materialDisabled(defaultValue, flag) {
if(this.isFromMip){
return !flag;
}
return defaultValue;
},
getDictData() {
const that = this;
that.unitDictData = [];
postAction(process.env.VUE_APP_API_BASE_DOMAIN + '/api-ils/data/code-master-heard/v1/get-master-for-page', {
codeType: 'CUSTOMS_DECLARATION_UNIT',
codeValue: this.model.erpUnit,
pageSize: 100
}).then(res => {
if (res && +res.code === 0) {
res.data.list.forEach(i => {
if (i.codeName && String(i.codeName).includes('-')) {
that.unitDictData.push({
value: String(i.codeName).split('-')[0],
text: i.codeName,
name: String(i.codeName).split('-')[1]
})
}
});
if (that.unitDictData.length) {
that.$set(this.model, 'unit', that.unitDictData[0].value);
that.$set(this.model, 'unitName', that.unitDictData[0].name);
} else {
that.$set(this.model, 'unit', '');
that.$set(this.model, 'unitName', '');
}
};
});
},
},
};
</script>
@ -868,5 +1013,18 @@ export default {
padding: 6px 16px;
display: flex;
}
.wrap-box {
position: relative;
.check-box {
position: absolute;
left: 34px;
top: 7px;
}
.check-box-short {
left: 64px;
}
}
}
</style>

31
src/views/merger/mergerapply/modules/MergerReqsModal.vue

@ -13,7 +13,7 @@
<w-button
@click="handleTransfer"
v-has="'MergerReqs:transfer'"
:disabled="!(head.status === '000' || head.status === '090')"
:disabled="btnDisabled"
type="primary"
>
转派
@ -21,11 +21,19 @@
<w-button
@click="handleGrouping"
v-has="'MergerReqs:group'"
:disabled="!(head.status === '000' || head.status === '090')"
:disabled="btnDisabled"
type="primary"
>
提交归类
</w-button>
<w-button
@click="splitHandle"
v-has="'MergerReqs:split'"
:disabled="btnDisabled"
type="primary"
>
拆单
</w-button>
<w-button @click="close()" type="primary"> 关闭 </w-button>
</div>
@ -57,6 +65,7 @@ import MergerReqsModalBodyForm from './MergerReqsModalBodyForm.vue';
import MergerReqsModalForm from './MergerReqsModalForm.vue';
import MergerReqsModalTransfer from './MergerReqsModalTransfer.vue';
import { getAction } from '@/api/manage';
import { submitClassify } from '../MergerReqsAction';
export default {
name: 'MergerReqsModal',
components: {
@ -77,7 +86,16 @@ export default {
head: {},
};
},
computed: {
btnDisabled() {
// /.
return !(this.head.status === '000' || this.head.status === '090');
},
},
methods: {
splitHandle() {
this.$refs.MergerReqsModalBody.splitHandle();
},
add() {
this.modalVisible = true;
this.head = {};
@ -153,11 +171,8 @@ export default {
/* 提交归类 */
handleGrouping() {
const that = this;
that.$confirm({
content: '确认是否提交归类?',
onOk: function () {
that.confirmLoading = true;
getAction('/merger/mergerReqsHead/submitMerge', { ids: that.head.id }).then((res) => {
submitClassify(that, { id: that.head.id }).then(res => {
if (res.success) {
that.$message.success(res.message);
that.modalFormClose();
@ -165,8 +180,8 @@ export default {
that.$message.warning(res.message);
that.confirmLoading = false;
}
});
},
}).finally(() => {
that.confirmLoading = false;
});
},
},

67
src/views/merger/mergerapply/modules/MergerReqsModalBody.vue

@ -22,11 +22,11 @@
</span>
</w-col>
<!-- <div class="leftArea" v-has="'MergerReqsBody:export'">
<div class="leftArea" v-has="'MergerReqsBody:export'">
<div class="filterBox">
<span class="iconfont icon-download-2" @click="exportExcel()"></span>
</div>
</div> -->
</div>
</w-row>
</div>
<!-- 查询区域-END -->
@ -127,6 +127,15 @@
:custom-row="selectRow"
class="j-table-force-nowrap"
>
<template slot="flowDialogIm" slot-scope="text, record">
<a href="javascript:void(0);" @click="openFlowHandle(record, head.impCtryCode)">{{ text }}</a>
</template>
<template slot="flowDialogEx" slot-scope="text, record">
<a href="javascript:void(0);" @click="openFlowHandle(record, head.expCtryCode)">{{ text }}</a>
</template>
<template slot="flowDialogGc" slot-scope="text, record">
<a href="javascript:void(0);" @click="openFlowHandle(record, 'GC')">{{ text }}</a>
</template>
<span slot="action" slot-scope="text, record">
<a v-has="'MergerReqsBody:edit'" @click="handlesEdit(record)">编辑</a>
@ -155,21 +164,25 @@
@close="modalFormClose"
:head="head"
/>
<flow-list-dialog ref="flowListDialogRef" />
</div>
</template>
<script>
import { getAction, postAction, deleteAction } from '@/api/manage';
import flowListDialog from './flowListDialog.vue';
import { JeecgListMixin, WGridResizeByCssMixin } from '@/mixins/JeecgListMixin';
import { mixinDevice } from '@/utils/mixin';
import ExcelExportModel from '@/views/excel/modules/ExcelExportModel.vue';
import ExcelImportModel from '@/views/excel/modules/ExcelImportModel.vue';
import { filterDictTextByFormatCache } from '@comp/dict/JDictSelectUtil';
import MergerReqsModalBodyFileUpload from './MergerReqsModalBodyFileUpload.vue';
import { mapGetters } from 'vuex';
export default {
name: 'MergerReqsModalBody',
components: {
flowListDialog,
ExcelExportModel,
ExcelImportModel,
MergerReqsModalBodyFileUpload,
@ -286,6 +299,7 @@ export default {
ellipsis: true,
sorter: true,
dataIndex: 'impCtryStatus_dictText',
scopedSlots: { customRender: 'flowDialogIm' },
},
{
title: '出口国归类状态',
@ -294,6 +308,7 @@ export default {
ellipsis: true,
sorter: true,
dataIndex: 'expCtryStatus_dictText',
scopedSlots: { customRender: 'flowDialogEx' },
},
{
title: '全球归类状态',
@ -302,6 +317,7 @@ export default {
ellipsis: true,
sorter: true,
dataIndex: 'gloStatus_dictText',
scopedSlots: { customRender: 'flowDialogGc' },
},
{
title: '进口国归类完成时间',
@ -449,6 +465,7 @@ export default {
checkGeneratePartNo: 'merger/mergerReqsList/checkGeneratePartNo',
importEleExcelUrl: 'merger/mergerReqsRdElem/importExcel',
exportXlsEleUrl: 'merger/mergerReqsRdElem/exportXls',
splitOrderUrl:'merger/mergerReqsList/splitOrder'
},
isorter: {
column: 'createTime',
@ -472,6 +489,49 @@ export default {
},
},
methods: {
...mapGetters(['userInfo']),
splitHandle() {
const source = String(this.head.mergeSource);
if (this.userInfo().username !== this.head.requesterId) {
this.$message.warning('非需求人,不能拆单!');
return;
}
if (!(this.head.status === '000' || this.head.status === '090')) {
this.$message.warning('需求单状态不满足暂存/归类驳回,不允许拆单!');
return;
}
if (this.selectedRowKeys.length === 0) {
this.$message.warning('请选择至少一条数据进行操作!');
return;
}
if (!(source === '1' || source === '2' || source === '3')) {
this.$message.warning('来源类型不满足,不允许拆单!');
return;
}
// if (this.selectedRowKeys.length === this.ipagination.total) {
// this.$message.warning('');
// return;
// }
const params = {
headId: this.head.id,
listIds: this.selectedRowKeys
};
const that = this;
that.$confirm({
title: '提示',
content: '是否确认拆单?',
onOk: function () {
postAction(that.url.splitOrderUrl, params).then((res) => {
if (res.success) {
that.$message.success(res.message);
that.loadData();
} else {
that.$message.warning(res.message);
}
});
},
});
},
/* 先加载字典、后加载数据 */
async initDictConfig() {},
handleDelete(id) {
@ -550,6 +610,9 @@ export default {
},
});
},
openFlowHandle(record, ctryCode) {
this.$refs.flowListDialogRef.show({ partNo : record.partNo, ctryCode } );
},
/* 数据拆分 */
handlesSplit(record) {
// if (this.selectedRowKeys.length !== 1) {

3
src/views/merger/mergerapply/modules/MergerReqsModalBodyForm.vue

@ -199,9 +199,6 @@ export default {
const that = this;
this.$refs.form.validate((valid) => {
if (valid) {
if (!that.$refs.MergerReqsModalBodyEleList.validateRequiredFields()) {
return;
}
that.loading = true;
const httpurl = that.model.id ? that.url.edit : that.url.add;
const method = that.model.id ? 'put' : 'post';

2
src/views/merger/mergerapply/modules/MergerReqsModalForm.vue

@ -160,6 +160,8 @@ export default {
reqsType: [{ required: true, message: '请选择需求单类型!', trigger: 'blur' }],
requesterId: [{ required: true, message: '请选择需求人!' }],
bussDepartCode: [{ required: true, message: '请选择事业部!' }],
impEnterpCode: [{ required: true, message: '请选择进口企业!' }],
expEnterpCode: [{ required: true, message: '请选择出口企业!' }],
},
url: {
add: '/merger/mergerReqsHead/add',

37
src/views/merger/mergerapply/modules/devClassifyAttr/config.js

@ -0,0 +1,37 @@
export default {
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1;
},
},
{
title: '附件',
align: 'center',
dataIndex: 'attachment',
ellipsis: true,
width: 150,
scopedSlots: { customRender: 'attachment' },
},
{
title: '要素名称',
align: 'center',
dataIndex: 'elemName',
ellipsis: true,
width: 100,
},
{
title: '要素值',
align: 'center',
dataIndex: 'elemValue',
ellipsis: true,
width: 100,
scopedSlots: { customRender: 'elemValue' },
}
]
}

217
src/views/merger/mergerapply/modules/devClassifyAttr/index.vue

@ -0,0 +1,217 @@
<template>
<div class="material-dev-classify-attr-comp">
<div class="small-title">
<div class="small-title_parent">研发分类要素</div>
<div class="small_label">
<div class="small_label_title">研发分类</div>
<div class="small_label_content" :title="rdCategory">{{ rdCategory }}</div>
</div>
</div>
<div class="dev-class-box">
<a-table ref="table"
id="DevClassify_table_columns_key"
:scroll="{ x: '100%', y: 176 }"
:columns="refColumns"
:data-source="dataSource"
:pagination="false"
:loading="loading"
size="middle"
:row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)"
bordered
row-key="id"
:components="resizableComponents"
class="j-table-force-nowrap">
<span slot="attachment" slot-scope="text, record">
<div v-for="item in record.fileList" :key="item.fileId">
<template v-if="item.suffix === 'pdf'">
<a-tooltip placement="top">
<template slot="title">
<span>pdf下载</span>
</template>
<a-icon @click="downloadFile(item)" :style="downIconStyle" type="download" />
</a-tooltip>
<a @click="pdfPreview(item)" :title="item.fileName">{{ item.fileName }}</a>
</template>
<viewer :images="[currentImgUrl]" v-else-if="['img', 'jpeg', 'png', 'jpg', 'gif', 'tif', 'tiff', 'bmp'].indexOf(item.suffix.toLowerCase()) !== -1
">
<a-tooltip placement="top">
<template slot="title">
<span>图片下载</span>
</template>
<a-icon @click="downloadFile(item)" :style="downIconStyle" type="download" />
</a-tooltip>
<img :src="currentImgUrl" :data-preview-title="item.fileName" style="display: none" :title="item.fileName"
:ref="`previewImg_${item.fileId}`" />
<a @click="triggerPreview(item)" :title="item.fileName">{{ item.fileName }}</a>
</viewer>
<template v-else>
<a-tooltip placement="top">
<template slot="title">
<span>文件下载</span>
</template>
<a-icon @click="downloadFile(item)" :style="downIconStyle" type="file-excel" />
</a-tooltip>
<span>{{ item.fileName }}</span>
</template>
</div>
</span>
<span slot="elemValue" slot-scope="text, record, index">
<md-select :disabled="true" v-model="record.elemValue" v-if="record.elemType === '2'" style="width: 100%">
<md-option v-for="(item, key) in record.elemContent.split('|')" :key="key" :value="item" :label="item"
style="padding-right: 8px" />
</md-select>
<w-input v-else disabled v-model="record.elemValue" maxlength="1000" />
</span>
</a-table>
</div>
<merger-file-print ref="mergerFilePrint" />
</div>
</template>
<script>
import { downloadFile, getImgUrlWithHeader } from '@/api/manage';
import { postAction } from '@/api/manage';
import { JeecgListMixin } from '@/mixins/JeecgListMixin';
import { mixinDevice } from '@/utils/mixin';
import MergerFilePrint from '@/views/merger/mergeredConfig/productClassify/modules/MergerFilePrint';
import config from './config';
export default {
name: 'DevClassify',
mixins: [JeecgListMixin, mixinDevice],
components: { MergerFilePrint },
data() {
return {
rdCategory: '',
currentImgUrl: '',
//
columns: config.columns,
url: {
list: '/merger/mergerMaterialMaster/v1/get-reqs-elem',
downloadAttrById: '/sys/common/excel/file/download',
downloadFileById: '/merger/mergerGoodsFile/downloadFileById',
},
superFieldList: [],
initeLoadData: false, // JeecgListMixincreated
downIconStyle: 'margin-right: 5px; font-size: 18px; color: #1991a9;cursor:pointer',
};
},
methods: {
pdfPreview(item) {
this.$refs.mergerFilePrint.show(item.fileId);
},
downloadMergerFile(record) {
downloadFile(this.url.downloadFileById, record.fileName, { id: record.id });
},
async show(id) {
const res = await postAction( this.url.list, {
id,
});
if (res && res.code === '0') {
this.rdCategory = res.data.rdCategory;
this.dataSource = res.data.elemList || [];
this.dataSource.forEach((element) => {
element.fileList = JSON.parse(element.fileInfos) || [];
element.fileList.forEach((file) => {
file.suffix = file.fileName.split('.')[file.fileName.split('.').length - 1] || '';
});
element.imgList = element.fileList.filter((item) =>
['img', 'jpeg', 'png', 'jpg', 'gif', 'tif', 'tiff', 'bmp'].includes(item.suffix.toLowerCase())
);
element.noImgList = element.fileList.filter(
(item) => !['img', 'jpeg', 'png', 'jpg', 'gif', 'tif', 'tiff', 'bmp'].includes(item.suffix.toLowerCase())
);
});
}
},
/* 下载文件 */
downloadFile(record) {
downloadFile(this.url.downloadAttrById, record.fileName, { fileId: record.fileId });
},
initDictConfig() { },
async triggerPreview(file) {
//
const isExists = await this.checkFileExists(file);
if (!isExists) {
//
this.$message.warning('文件不存在或无法访问');
return;
}
//
const imgRef = this.$refs[`previewImg_${file.fileId}`]?.[0];
if (imgRef) {
imgRef.click();
}
},
/* 检查文件是否存在 */
async checkFileExists(file) {
this.currentImgUrl = await getImgUrlWithHeader(file.fileId);
return new Promise((resolve) => {
const img = new Image();
img.src = this.currentImgUrl;
// 3
const timeoutTimer = setTimeout(() => {
resolve(false);
}, 3000);
//
img.onload = () => {
clearTimeout(timeoutTimer);
resolve(true);
};
//
img.onerror = () => {
clearTimeout(timeoutTimer);
resolve(false);
};
});
},
},
};
</script>
<style lang="less">
.material-dev-classify-attr-comp {
.small-title {
font-size: 12px;
color: grey;
font-weight: 700;
height: 30px;
padding: 6px 16px;
display: flex;
width: 100%;
.small-title_parent {
min-width: 80px;
}
.small_label {
flex: 1;
margin-left: 10px;
display: flex;
color: #212b36;
width: 100%;
min-width: 0;
.small_label_title {
width: 60px;
}
.small_label_content {
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
min-width: 0;
}
}
}
}
</style>

59
src/views/merger/mergerapply/modules/flowListConfig.js

@ -0,0 +1,59 @@
/**
* 流程记录弹窗表格配置
*/
// 表格列配置
export const flowListColumns = [
{
title: '#',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '流程活动',
align: 'center',
dataIndex: 'actionName',
ellipsis: true,
width: 100
},
{
title: '执行人',
align: 'center',
dataIndex: 'createName',
ellipsis: true,
width: 100
},
{
title: '待执行人',
align: 'center',
dataIndex: 'actorId',
ellipsis: true,
width: 100,
},
{
title: '执行时间',
align: 'center',
dataIndex: 'createTime',
ellipsis: true,
width: 100
},
{
title: '状态',
align: 'center',
dataIndex: 'taskName',
ellipsis: true,
width: 100
},
{
title: '备注',
align: 'center',
dataIndex: 'remark',
ellipsis: true,
width: 100
}
]

108
src/views/merger/mergerapply/modules/flowListDialog.vue

@ -0,0 +1,108 @@
<template>
<j-modal
:title="title"
:width="1000"
:visible="visible"
:mask-closable="false"
@cancel="handleCancel"
footer>
<a-card>
<div>
<a-table
ref="table"
:id="refColumnsKey"
:scroll="getTableScroll(1000)"
:columns="refColumns"
:data-source="dataSource"
:pagination="ipagination"
:custom-header-row="customHeaderRow"
size="middle"
:loading="loading"
bordered
@change="handleTableChange"
:components="resizableComponents"
row-key="codeTS"
:custom-row="selectRow"
:row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)"
class="j-table-force-nowrap"
/>
</div>
<w-table-columns-win
ref="choose"
@columnsChange="columnsChange"
@resetColumns="resetColumns"
:columns="columns"
/>
</a-card>
</j-modal>
</template>
<script>
import { JeecgListMixin } from '@/mixins/JeecgListMixin';
import { postAction } from '@/api/manage';
import { flowListColumns } from './flowListConfig';
export default {
name: 'FlowListModal',
mixins: [JeecgListMixin],
data() {
return {
title: '流程记录',
width: 1200,
visible: false,
loading: false,
initeLoadData: false,
data: [],
//
columns: flowListColumns,
url: {
list: '/merger/mergerReqsList/v1/query-flow-by-id',
},
isorter: {
column: 'createTime',
order: 'desc'
}
}
},
created() {
},
methods: {
show(params) {
this.visible = true;
this.queryParam.partNo = params.partNo;
this.queryParam.ctryCode = params.ctryCode;
this.loadData();
},
handleCancel() {
this.visible = false;
},
loadData(arg) {
// 1
if (arg === 1) {
this.ipagination.current = 1;
}
const params = this.getQueryParams(); //
this.loading = true;
postAction(this.url.list, params)
.then((res) => {
if (res.success) {
this.dataSource = !res.result ? [] : res.result.records || res.result;
if (res.result && res.result.total) {
this.ipagination.total = parseInt(res.result.total);
} else {
this.ipagination.total = 0;
}
} else {
this.$message.warning(res.message);
}
})
.finally(() => {
this.afterLoadData();
this.loading = false;
});
},
}
}
</script>

91
src/views/merger/mergerapply/modules/materialRemarkDialog.vue

@ -0,0 +1,91 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:ok-button-props="{ class: { 'jee-hidden': true } }"
@cancel="close"
switch-fullscreen
cancel-text="关闭"
>
<w-form ref="form" :model="model">
<w-row>
<w-col :span="22">
<w-form-item label="要素采集备注" prop="elementInitRemark">
<a-textarea v-model="model.elementInitRemark" />
</w-form-item>
</w-col>
</w-row>
</w-form>
<template slot="footer">
<w-button @click="close"> 关闭 </w-button>
<w-button :loading="loading" @click="handleOk" type="primary"> 提交 </w-button>
</template>
</j-modal>
</template>
<script>
import { postAction } from '@/api/manage';
export default {
name: 'materialRemarkDialog',
components: {},
data() {
return {
title: '要素采集',
width: 800,
visible: false,
model: {
elementInitRemark: '',
},
loading: false,
url: {
elementCollection: '/merger/mergerMaterialMaster/v1/element-collection-detail',
},
modelData: {}
};
},
methods: {
show(modelData) {
this.visible = true;
this.modelData = modelData;
},
handleOk() {
const that = this;
this.$refs.form.validate((valid) => {
if (valid) {
const { id, tickMaterial, tickElement } = this.modelData;
that.loading = true;
postAction(
that.url.elementCollection,
{
id,
tickMaterial,
tickElement,
elementInitRemark: this.model.elementInitRemark,
}
)
.then((res) => {
if (res && res.code === '0') {
that.$message.success('要素采集成功!');
that.$emit('ok');
that.close();
} else {
that.$message.error(res.message || res.msg);
}
})
.finally(() => {
that.loading = false;
});
}
});
},
close() {
this.visible = false;
this.loading = false;
this.modelData = '';
this.$refs.form.resetFields();
},
},
};
</script>

250
src/views/merger/mergeredConfig/productClassify/index.vue

@ -60,7 +60,7 @@
</w-col>
</template>
<w-col :xl="4" :lg="5" :md="8" :sm="24">
<div class="table-page-search-submitButtons">
<div class="table-page-search-submit-buttons">
<w-button @click="searchQuery" type="primary" icon="search"> 搜索 </w-button>
<w-button @click="searchReset" type="primary" style="margin-left: 8px"> 重置 </w-button>
<j-super-query ref="superQueryModal" :field-list="refColumns" @handleSuperQuery="handleSuperQuery" />
@ -70,10 +70,10 @@
</a>
</div>
</w-col>
<div @click="exportModel()" class="leftArea" v-has="authObj.export">
<div @click="exportModel()" class="right-export-area" v-has="authObj.export">
<!-- <w-button type="primary" icon="download" @click="exportModel('bill_head')"
v-has="'bill:bill:export' + ieFlag + isBonded + emsCategory + menuType">导出</w-button> -->
<div class="filterBox">
<div class="filter-box">
<span class="iconfont icon-download-2"></span>
</div>
</div>
@ -111,6 +111,14 @@
>
驳回
</w-button>
<w-button
v-if="flag === 'queryClassify'"
@click="transferHandle"
type="primary"
v-has="'queryClassify:transfer'"
>
转派
</w-button>
<w-button
v-if="flag === 'queryClassify'"
v-has="'queryClassify:resetClassify'"
@ -130,6 +138,14 @@
>
变更HSCode(全球)
</w-button>
<w-button
v-if="flag === 'queryClassify'"
@click="importModelHandle"
type="primary"
v-has="'queryClassify:import'"
>
导入修改HSCODE
</w-button>
<w-button
v-if="flag === 'productClassify'"
@click="importModel"
@ -154,6 +170,24 @@
>
要素批量导出
</w-button>
<w-button
v-if="flag === 'productClassify'"
v-has="'productClassify:batchAudit'"
:loading="batchAuditSubmitLoading"
type="primary"
@click="batchAuditSubmitHandle"
>
批量提交审核
</w-button>
<w-button
v-if="flag === 'reviewClassify'"
v-has="'productClassify:batchAuditPass'"
:loading="batchAuditPassLoading"
type="primary"
@click="batchAuditPassHandle"
>
批量审核通过
</w-button>
</div>
<!-- table区域-begin -->
<div>
@ -164,7 +198,7 @@
:scroll="getTableScroll(1200)"
:columns="refColumns"
:data-source="dataSource"
:pagination="ipagination"
:pagination="pageParams"
:loading="loading"
size="middle"
:custom-header-row="customHeaderRow"
@ -181,10 +215,10 @@
<a
v-if="!['010', '070', '030', '071', '072'].includes(row.classifyStatus) || row.globalLock === 'Y'"
@click="handleDetail(row)"
>{{ text }}</a
>
>{{ text }}</a>
<a v-else @click="handleEdit(row)">{{ text }}</a>
</div>
<a v-else-if="flag === 'reviewClassify'" @click="handleEdit(row)">{{ text }}</a>
<a v-else @click="handleDetail(row)">{{ text }}</a>
</span>
<span slot="classifyStatus" slot-scope="text, records">
@ -195,8 +229,7 @@
<span
v-if="!['010', '070', '030', '071', '072'].includes(row.classifyStatus) || row.globalLock === 'Y'"
v-has="'productClassify:edit'"
>编辑</span
>
>编辑</span>
<a v-else @click="handleEdit(row)" v-has="'productClassify:edit'">编辑</a>
<w-divider type="vertical" v-has="'productClassify:edit'" />
<a v-has="'productClassify:submit'" @click="submitFlow(row)" type="primary"> 提交审核 </a>
@ -356,12 +389,16 @@
</w-form>
</j-modal>
<ApprovalProgressTemplate ref="ApprovalProgressTemplate" @ok="handleOk" />
<ApprovalProgressTemplateNew ref="ApprovalProgressTemplateNew" @ok="handleOk" />
<FlowListModal ref="FlowListModal" @ok="handleOk" />
<batch-audit-pass-dialog ref="batchAuditPassDialogRef" @ok="passHandleOk" />
<batch-audit-user-dialog ref="batchAuditUserDialogRef" @ok="userHandleOk" />
</w-card>
</template>
<script>
import ApprovalProgressTemplate from '@/components/ApprovalProgressTemplate/index';
import ApprovalProgressTemplateNew from '@/components/ApprovalProgressTemplate/indexNew';
import { JeecgListMixin, WGridResizeByCssMixin } from '@/mixins/JeecgListMixin';
import { mixinDevice } from '@/utils/mixin';
import ExcelExportModel from '@/views/excel/modules/ExcelExportModel.vue';
@ -369,26 +406,33 @@ import ExcelExportPage from '@/views/excel/modules/ExcelExportPage.vue';
import ExcelImportModel from '@/views/excel/modules/ExcelImportModel.vue';
import ExcelImportPage from '@/views/excel/modules/ExcelImportPage.vue';
import MergerGoodsModal from './modules/MergerGoodsModal';
import batchAuditPassDialog from './modules/batchAuditPassDialog';
import batchAuditUserDialog from './modules/batchAuditUserDialog';
import FlowListModal from './modules/FlowListModal';
import { mapGetters } from 'vuex';
import AppprovalUserSelect from '@/components/AppprovalUserSelect/index';
import { getAction, postAction } from '@/api/manage';
import lodash from 'lodash';
export default {
name: 'productClassify',
name: 'ProductClassify',
mixins: [JeecgListMixin, mixinDevice, WGridResizeByCssMixin],
components: {
batchAuditPassDialog,
batchAuditUserDialog,
MergerGoodsModal,
ExcelExportModel,
ExcelImportModel,
ExcelExportPage,
ExcelImportPage,
ApprovalProgressTemplate,
ApprovalProgressTemplateNew,
FlowListModal,
AppprovalUserSelect,
},
data() {
return {
fdTemplateCode: '',
flag: 'productClassify',
authObj: {
query: 'productClassify:query',
@ -679,6 +723,7 @@ export default {
},
],
url: {
getFdTemplateCodeApi: '/merger/mergerGoods/v1/check-merger-goods-by-id', // Code
list: '/merger/mergerGoods/list',
delete: '/merger/mergerGoods/delete',
deleteBatch: '/merger/mergerGoods/deleteBatch',
@ -694,6 +739,8 @@ export default {
preAuditVerification: '/merger/mergerGoods/preAuditVerification',
regulationValid: '/interfaces/hscode/desc/regulationExpand',
exportXlsEleUrl: 'merger/mergerReqsRdElem/exportXls',
batchAuditPass: '/flow/common/batch-approve-pass',
batchAuditSubmit: '/flow/common/batch-submit',
},
flowStatusCode: '',
dictOptions: {},
@ -705,6 +752,9 @@ export default {
record: null,
country: '',
hiddenColumns: false,
handlersData: [],
batchAuditSubmitLoading: false,
batchAuditPassLoading: false,
};
},
created() {
@ -785,7 +835,7 @@ export default {
this.handleDetail(this.record);
}
} else if (this.flag === 'reviewClassify') {
this.handleDetail(this.record);
this.handleEdit(this.record);
}
}
},
@ -830,7 +880,17 @@ export default {
return ' ';
}
},
showApprovalDialog(type,data) {
// data.fdTemplateCode = type;
if(type === 'mergerApply'){
this.$refs.ApprovalProgressTemplate.show(data);
} else {
this.$refs.ApprovalProgressTemplateNew.show(data);
}
},
async submitFlow(record) {
//
this.fdTemplateCode = 'mergerApply';
if (record.globalLock === 'N') {
const resp = await getAction(this.url.preAuditVerification, {
id: record.id,
@ -842,27 +902,41 @@ export default {
countryCode: record.country,
hscode: record.hsCode,
});
// ID
const fdTemplateData = await getAction(this.url.getFdTemplateCodeApi, { id: record.id });
if (fdTemplateData && String(fdTemplateData.code) === '50002') {
this.$message.error(fdTemplateData.message);
return false;
} else if (fdTemplateData && String(fdTemplateData.code) === '50001') {
this.fdTemplateCode = 'mergerApplyFactory';
} else {
this.fdTemplateCode = 'mergerApply';
}
if (valid.success) {
this.$refs.ApprovalProgressTemplate.show({
const data = {
fdTemplateCode: this.fdTemplateCode || 'mergerApply',
id: record.id,
defaultverifyBy: record.verifyBy,
flowId: record.flowId,
type: 'submit',
title: `${record.countryName}${record.partNo} 商品归类`,
});
};
this.showApprovalDialog(this.fdTemplateCode , data);
} else {
if (valid.code === 5010) {
const that = this;
this.$confirm({
content: valid.message + ',是否继续提交?',
onOk: function () {
that.$refs.ApprovalProgressTemplate.show({
const data = {
fdTemplateCode: this.fdTemplateCode || 'mergerApply',
id: record.id,
defaultverifyBy: record.verifyBy,
flowId: record.flowId,
type: 'submit',
title: `${record.countryName}${record.partNo} 商品归类`,
});
};
that.showApprovalDialog(that.fdTemplateCode , data);
},
});
} else {
@ -871,6 +945,7 @@ export default {
}
} else {
this.$refs.ApprovalProgressTemplate.show({
fdTemplateCode: 'mergerApply',
id: record.id,
defaultverifyBy: record.verifyBy,
flowId: record.flowId,
@ -908,11 +983,22 @@ export default {
return;
}
this.$refs.ApprovalProgressTemplate.show({
fdTemplateCode: 'mergerApply',
id: this.selectedRowKeys[0],
flowId: this.selectionRows[0].flowId,
type: 'audit',
});
},
transferHandle() {
if (this.selectedRowKeys.length === 0) {
this.$warning({ title: '提示', content: '请至少选择一条数据!' });
return;
}
this.flowStatusCode = '';
this.currentBy = '';
this.currentByName = '';
this.changeExamineVisible = true;
},
//
changeExamineStatus(code) {
if (this.selectedRowKeys.length === 0) {
@ -922,8 +1008,8 @@ export default {
//
if (this.flag === 'productClassify') {
const obj = this.selectionRows[0];
if (!['010', '070', '030'].includes(obj.classifyStatus) || obj.globalLock === 'Y') {
this.$warning({ title: '提示', content: '请选择全球锁为N且归类状态为商品归类、审核退回或重新归类的数据!' });
if (!['010', '070', '030', '090'].includes(obj.classifyStatus)) {
this.$warning({ title: '提示', content: '请选择归类状态为商品归类、审核退回或重新归类的数据!' });
return;
}
}
@ -993,7 +1079,9 @@ export default {
}
this.recordObj = this.selectionRows[0];
this.classifierForm.classifierBy = this.selectionRows[0].classifierBy;
this.classifierForm.classifierName = this.selectionRows[0].classifier;
this.classifierForm.verifyBy = this.selectionRows[0].verifyBy;
this.classifierForm.verifyByName = this.selectionRows[0].verifyByName;
this.classifyShow = true;
},
async classifyOK() {
@ -1144,6 +1232,9 @@ export default {
const para = {};
this.$refs.importModel.show(this.url.importExcelUrl, 'MERGER_GOODS', para);
},
importModelHandle() {
this.$refs.importModel.show(this.url.importExcelUrl, 'MERGER_GOODS_HS_CODE_IMPORT', {});
},
returnOK() {
this.$refs.returnForm.validate(async (valid) => {
if (valid) {
@ -1192,6 +1283,133 @@ export default {
'MIDEA_MERGER_REQS_RD_ELEM'
);
},
selectionRowsVerify(max, msg) {
if (this.selectionRows.length === 0) {
this.$message.warning('请选择至少一条数据进行操作!');
return false;
}
if (max && this.selectionRows.length > max) {
this.$message.warning(msg || `最多选择${max}条数据进行操作!`);
return false;
}
return true;
},
passHandleOk(data) {
if (data.type === 'submit') {
this.submitPostHandle(data);
} else {
this.passPostHandle(data);
}
},
passPostHandle(data) {
const that = this;
this.batchAuditPassLoading = true;
postAction(that.url.batchAuditPass, {
mergerGoodsIds: that.selectedRowKeys,
auditNote: data.remark,
handlers: [],
fdTemplateCode: 'mergerApply',
})
.then((res) => {
if (res && res.success) {
that.batchNoticeHandle(res, 'pass');
}
})
.finally(() => {
that.batchAuditPassLoading = false;
});
},
submitPostHandle(data) {
const that = this;
this.batchAuditSubmitLoading = true;
postAction(that.url.batchAuditSubmit, {
mergerGoodsIds: that.selectedRowKeys,
auditNote: data.remark,
handlers: this.handlersData,
fdTemplateCode: 'mergerApply',
})
.then((res) => {
if (res && res.success) {
that.batchNoticeHandle(res);
}
})
.finally(() => {
that.batchAuditSubmitLoading = false;
});
},
userHandleOk(data) {
this.handlersData = lodash.isEmpty(data)
? []
: [
{
unmodifiable: true,
name: data.operatorName,
id: data.operator,
type: 'USER',
},
];
this.$refs.batchAuditPassDialogRef.show({
title: '批量提交审核',
type: 'submit',
});
},
batchAuditPassHandle() {
if (!this.selectionRowsVerify(50)) {
return;
}
this.$refs.batchAuditPassDialogRef.show({
title: '批量审核通过',
type: 'pass',
});
},
batchAuditSubmitHandle() {
const that = this;
if (!this.selectionRowsVerify(50)) {
return;
}
if (this.selectionRows.some((i) => i.classifyStatus === '090')) {
this.$message.warning('不能勾选状态为090-归类驳回的数据进行操作!');
return;
}
this.$confirm({
content: `是否修改审批人?`,
okText: '是',
cancelText: '否',
onOk: function () {
that.$refs.batchAuditUserDialogRef.show({});
},
onCancel: function () {
that.handlersData = [];
that.$refs.batchAuditPassDialogRef.show({
title: '批量提交审核',
type: 'submit',
});
},
});
},
batchNoticeHandle(res, type = 'submit') {
let msg = '';
if (res.result && res.result.fail > 0) {
if (type === 'pass') {
msg = '(' + res.result.approveFailMsg + ')';
} else {
msg = '(料号:' + res.result.partNo + ')';
}
}
this.$MdAlert(
`<div style="word-break: break-all;">成功:${res.result.success}条<br>` +
`失败:${res.result.fail}${msg} </div>`,
'处理结果',
{
showClose: false,
confirmButtonText: '确定',
dangerouslyUseHTMLString: true,
callback: () => {
this.loadData();
},
}
);
},
},
};
</script>

8
src/views/merger/mergeredConfig/productClassify/modules/CNregulatoryConditions.vue

@ -18,6 +18,14 @@
<w-button @click="searchReset" type="primary" style="margin-left: 8px">重置</w-button>
</span>
</w-col>
<w-col :span="2">
<a-tooltip>
<template slot="title">
监管条件内容为所选附加编码匹配监管条件说明内容前3位数值一致的结果
</template>
<a-icon class="iconfont" width="2em" height="2em" type="question-circle" />
</a-tooltip>
</w-col>
</w-row>
</w-form>
</div>

182
src/views/merger/mergeredConfig/productClassify/modules/MergerGoodsForm.vue

@ -7,8 +7,9 @@
:disabled="formDisabled"
type="primary"
@click="submitForm"
>保存</w-button
>
保存
</w-button>
<w-button
v-if="flag === 'queryClassify'"
@click="submitForm"
@ -161,7 +162,7 @@
<div>{{ model.country + '-' + model.countryName }}</div>
</div>
</div>
<j-form-container>
<j-form-container class="merger-good-form-box">
<w-form ref="form" slot="detail" :model="model" :rules="validatorRules" v-next>
<!-- start 中国 -->
<w-row v-if="model.country === 'CN'">
@ -396,6 +397,7 @@
>
<w-input
v-model="model.limitConditions"
readonly
placeholder="请输入海外监管条件"
:maxLength="500"
:disabled="formDisabled"
@ -407,6 +409,16 @@
<w-input v-model="model.remarks" :maxLength="250" placeholder="请输入备注" :disabled="formDisabled" />
</w-form-item>
</w-col>
<w-col :span="12" v-if="showAdditionCode">
<w-form-item :label-col="labelCol" :wrapper-col="wrapperCol" label="附加编码" prop="additionalCode">
<div style="display: flex; align-items: center; width: 100%">
<w-input v-model="model.additionalCode" readonly placeholder="请选择附加编码" />
<div @click="showAdditionCodeHandle" class="plus-box">
<a-icon type="plus" style="color: #ffffff" />
</div>
</div>
</w-form-item>
</w-col>
</w-row>
<!-- end -->
</w-form>
@ -428,7 +440,7 @@
v-model="activeKeyBottom"
type="card"
style="width: 100%"
class="ant-modal-tab tabFixed merger-tab"
class="ant-modal-tab merger-tab"
>
<w-tab-pane key="declarationElements" v-if="model.country === 'CN'" :force-render="true" tab="申报要素">
<a-table
@ -559,6 +571,8 @@
</w-form>
</j-modal>
<ApprovalProgressTemplate ref="ApprovalProgressTemplate" @ok="$emit('close')" />
<ApprovalProgressTemplateNew ref="ApprovalProgressTemplateNew" @ok="$emit('close')" />
<addition-code-dialog ref="additionCodeDialogRef" @confirm="confirmAdditionCode" />
</a-spin>
</template>
@ -576,10 +590,13 @@ import CNattachmentCode from './CNattachmentCode';
import CNregulatoryConditions from './CNregulatoryConditions';
import CNtaxrateDesc from './CNtaxrateDesc';
import ApprovalProgressTemplate from '@/components/ApprovalProgressTemplate/index';
import ApprovalProgressTemplateNew from '@/components/ApprovalProgressTemplate/indexNew';
import additionCodeDialog from './additionCodeDialog';
export default {
name: 'MideaMergerGoodsForm',
components: {
additionCodeDialog,
WorkflowList,
ModifyRecord,
devClassify,
@ -587,6 +604,7 @@ export default {
copGNoInfo,
CNhSCodeModal,
ApprovalProgressTemplate,
ApprovalProgressTemplateNew,
CNtaxrateInfo,
CNtaxrateInfoCN,
CNregulatoryConditions,
@ -608,6 +626,7 @@ export default {
},
data() {
return {
fdTemplateCode: '',
// activeKeyTop: 'devClassify',
activeKeyBottom: 'declarationElements',
elemList: [],
@ -624,6 +643,7 @@ export default {
},
confirmLoading: false,
validatorRules: {
additionalCode: [{ required: true, message: '请选择附加编码!', trigger: 'blur' }],
hsCode: [{ required: true, message: '请输入HSCode!', trigger: 'blur' }],
gname: [{ required: true, message: '请输入商品名称!', trigger: 'blur' }],
},
@ -638,6 +658,7 @@ export default {
hscodDetail: '/interfaces/hscode/detail',
preAuditVerification: '/merger/mergerGoods/preAuditVerification',
regulationValid: '/interfaces/hscode/desc/regulationExpand',
getFdTemplateCodeApi: '/merger/mergerGoods/v1/check-merger-goods-by-id', // Code
},
//
elementColumns: [
@ -694,6 +715,10 @@ export default {
formDisabled() {
return this.disabled;
},
showAdditionCode() {
//
return this.model.country && this.model.country === 'TH';
},
controlMaQuanType() {
if (this.model.controlMa && this.model.quanType) {
return this.model.controlMa + ',' + this.model.quanType;
@ -711,6 +736,13 @@ export default {
this.modelDefault = JSON.parse(JSON.stringify(this.model));
},
methods: {
showAdditionCodeHandle() {
this.$refs.additionCodeDialogRef.show({ data: this.model });
},
confirmAdditionCode(data) {
this.model.additionalCode = data.additionalCode;
this.getOtherCountry();
},
timestampToDate(timestamp) {
if (!timestamp) {
return '';
@ -724,18 +756,34 @@ export default {
// yyyy-MM-dd
return `${year}-${month}-${day}`;
},
getSubmitFlowUrl() {
let httpurl = '';
let method = '';
if (!this.model.id) {
httpurl += this.url.add;
method = 'post';
} else {
httpurl += this.url.edit;
method = 'put';
}
return {
httpurl,
method,
};
},
async submitFlow() {
if (this.model.globalLock === 'N') {
this.fdTemplateCode = 'mergerApply';
if (this.model.globalLock === 'Y') {
return this.$message.error('全球锁为Y的数据不允许提交');
}
// HSCode
if (this.model.country === 'GC') {
if (this.model.hsCode.length !== 6) {
this.$message.error('国家为全球时,HSCode必须是6位');
return; // return
return this.$message.error('国家为全球时,HSCode必须是6位');
}
} else if (!['GC', 'CN'].includes(this.model.country)) {
if (this.model.hsCode.length < 6) {
this.$message.error('国家为海外时,HSCode必须大于等于6位');
return; // return
if (this.model.hsCode && this.model.hsCode.length < 6) {
return this.$message.error('国家为海外时,HSCode必须大于等于6位');
}
}
const that = this;
@ -743,15 +791,7 @@ export default {
this.$refs.form.validate(async (valid) => {
if (valid) {
that.confirmLoading = true;
let httpurl = '';
let method = '';
if (!this.model.id) {
httpurl += this.url.add;
method = 'post';
} else {
httpurl += this.url.edit;
method = 'put';
}
const { httpurl, method } = this.getSubmitFlowUrl();
const goodsElementList = this.elementDataSource;
goodsElementList.forEach((item) => {
item.goodsId = this.model.id;
@ -783,10 +823,11 @@ export default {
id: this.model.id,
});
if (resp.success) {
if (this.model.country === 'ID') {
if (this.model.country === 'ID' || this.model.country === 'TH') {
this.SubmitValid();
} else {
this.$refs.ApprovalProgressTemplate.show({
fdTemplateCode: 'mergerApply',
id: this.model.id,
flowId: this.model.flowId,
defaultverifyBy: this.model.verifyBy,
@ -815,22 +856,59 @@ export default {
}
}
});
},
//
showApprovalDialog(type,data) {
// data.fdTemplateCode = type;
if(type === 'mergerApply'){
this.$refs.ApprovalProgressTemplate.show(data);
} else {
this.$message.error('全球锁为Y的数据不允许提交');
this.$refs.ApprovalProgressTemplateNew.show(data);
}
},
//
validFactoryMode(id) {
return new Promise((resolve, reject) => {
getAction(this.url.getFdTemplateCodeApi, { id }).then(res => {
if (res && String(res.code) === '50002') {
this.$message.error(res.message);
resolve(false);
} else if (res && String(res.code) === '50001') {
resolve('mergerApplyFactory');
} else {
resolve('mergerApply');
}
}).catch((error) => {
reject(error);
});
});
},
async auditFlow() {
if (this.model.country === 'ID') {
const valid = await getAction(this.url.regulationValid, {
this.fdTemplateCode = 'mergerApply';
if (this.model.country === 'ID' || this.model.country === 'TH') {
const data = {
countryCode: this.model.country,
hscode: this.model.hsCode,
});
};
if (this.model.country === 'TH') {
data.additionalCode = this.model.additionalCode;
}
if( this.model.country === 'ID'){
const res = await this.validFactoryMode(this.model.id);
if(res === false){
return false;
}
this.fdTemplateCode = res;
}
const valid = await getAction(this.url.regulationValid, data);
if (valid.success) {
this.$refs.ApprovalProgressTemplate.show({
const data = {
fdTemplateCode: this.fdTemplateCode || 'mergerApply',
id: this.model.id,
flowId: this.model.flowId,
type: 'audit',
});
};
this.showApprovalDialog(this.fdTemplateCode,data);
} else {
if (valid.code === 5010) {
this.$message.error(valid.message + ',请先维护数据!');
@ -840,6 +918,7 @@ export default {
}
} else {
this.$refs.ApprovalProgressTemplate.show({
fdTemplateCode: 'mergerApply',
id: this.model.id,
flowId: this.model.flowId,
type: 'audit',
@ -888,6 +967,9 @@ export default {
flag: this.flag,
});
}
if (this.model.country === 'TH' && value) {
this.initAdditionalCode();
}
},
filterOption(input, option) {
return option.componentOptions.children[0].text.indexOf(input) !== -1;
@ -895,10 +977,20 @@ export default {
closeModal(record) {
if (record) {
this.model.hsCode = record.codeTS || record.hscode;
if (this.model.country === 'TH') {
this.initAdditionalCode();
}
this.queryByIdHscode('enter');
}
this.CNhSCodeModalShow = false;
},
initAdditionalCode() {
this.model.additionalCode = '';
this.regulatoryConditionsDataSource = [];
if (this.activeKeyBottom === 'regulatoryConditions') {
this.$refs.CNregulatoryConditions.show(this.regulatoryConditionsDataSource);
}
},
// HSCode
showHsCode() {
if (this.formDisabled) {
@ -1087,6 +1179,7 @@ export default {
const resp = await getAction(this.url.hscodDetail, {
hscode: this.model.hsCode,
countryCode: this.model.country,
additionalCode: this.model.country === 'TH' ? this.model.additionalCode : undefined,
});
if (resp.success) {
const result = JSON.parse(resp.result);
@ -1251,6 +1344,8 @@ export default {
}
}
});
} else {
that.$message.warning('请检查必填项');
}
});
},
@ -1358,31 +1453,46 @@ export default {
});
},
async SubmitValid() {
const valid = await getAction(this.url.regulationValid, {
const data = {
countryCode: this.model.country,
hscode: this.model.hsCode,
});
};
if (this.model.country === 'TH') {
data.additionalCode = this.model.additionalCode;
}
const valid = await getAction(this.url.regulationValid, data);
if( this.model.country === 'ID'){
const res = await this.validFactoryMode(this.model.id);
if(res === false){
return false;
}
this.fdTemplateCode = res;
}
if (valid.success) {
this.$refs.ApprovalProgressTemplate.show({
const data = {
fdTemplateCode: this.fdTemplateCode || 'mergerApply',
id: this.model.id,
flowId: this.model.flowId,
defaultverifyBy: this.model.verifyBy,
type: 'submit',
title: `${this.model.countryName}${this.model.partNo} 商品归类`,
});
};
this.showApprovalDialog(this.fdTemplateCode,data);
} else {
if (valid.code === 5010) {
const that = this;
this.$confirm({
content: valid.message + ',是否继续提交?',
onOk: function () {
that.$refs.ApprovalProgressTemplate.show({
const data = {
fdTemplateCode: that.fdTemplateCode || 'mergerApply',
id: that.model.id,
flowId: that.model.flowId,
defaultverifyBy: that.model.verifyBy,
type: 'submit',
title: `${that.model.countryName}${that.model.partNo} 商品归类`,
});
};
that.showApprovalDialog(that.fdTemplateCode,data);
},
});
} else {
@ -1435,7 +1545,15 @@ export default {
}
}
}
.merger-good-form-box {
.plus-box {
width: 26px;
height: 26px;
background-color: #0f69ff;
line-height: 26px;
text-align: center;
}
}
/deep/ .md-form-item__label {
width: 120px;
}

54
src/views/merger/mergeredConfig/productClassify/modules/ModifyRecordList.vue

@ -20,8 +20,39 @@
:components="resizableComponents"
:custom-row="selectRow"
class="j-table-force-nowrap"
>
<span slot="beforeData" slot-scope="text, row">
<div v-if="row.isFile">
<div v-if="row.before && row.before.length">
<WInputUploadFile
:fileValueList.sync="row.before"
:disabled="false"
:uploadBtnShow="false"
:DelBtnShow="false"
/>
</div>
</div>
<div v-else>
{{ text }}
</div>
</span>
<span slot="afterData" slot-scope="text, row">
<div v-if="row.isFile">
<div v-if="row.after && row.after.length">
<WInputUploadFile
:fileValueList.sync="row.after"
:disabled="false"
:uploadBtnShow="false"
:DelBtnShow="false"
/>
</div>
</div>
<div v-else>
{{ text }}
</div>
</span>
</a-table>
</div>
<w-table-columns-win
ref="choose"
@columnsChange="columnsChange"
@ -66,14 +97,16 @@ export default {
title: '变更前数据',
align: 'center',
dataIndex: 'before',
width: 150,
scopedSlots: { customRender: 'beforeData' },
width: 250,
ellipsis: true
},
{
title: '变更后数据',
align: 'center',
dataIndex: 'after',
width: 150,
scopedSlots: { customRender: 'afterData' },
width: 250,
ellipsis: true
}
],
@ -88,7 +121,22 @@ export default {
computed: {},
methods: {
show (record) {
this.dataSource = JSON.parse(record.diffList)
const that = this;
this.dataSource = JSON.parse(record.diffList);
this.dataSource.forEach(item => {
if (item.field.includes('(附件)')) {
item.isFile = true;
item.after = that.parseStr(item.after);
item.before = that.parseStr(item.before);
}
})
},
parseStr(fieldString) {
try {
return JSON.parse(fieldString);
} catch (error) {
return fieldString;
}
},
initDictConfig () { },
getSuperFieldList () {

2
src/views/merger/mergeredConfig/productClassify/modules/ModifyRecordModal.vue

@ -24,7 +24,7 @@ export default {
data () {
return {
title: '',
width: 800,
width: 1100,
visible: false,
disableSubmit: false
}

42
src/views/merger/mergeredConfig/productClassify/modules/additionCode.js

@ -0,0 +1,42 @@
export default {
searchFields: [
{
name: '附加编码',
value: 'additionalCode',
type: 'input',
isFixed: true,
span: 3
},
{
name: '语言类别',
value: 'cultureCode',
type: 'select',
optionsKey: 'GLOBAL_TARIFF_LANGUAGE_TYPE',
isFixed: true,
span: 3
}
],
columns:[
{
label: '附加编码',
prop: 'additionalCode',
'width': 130,
},
{
label: '附加编码类型',
prop: 'additionalCodeType',
'width': 130,
},
{
label: '附加编码说明',
prop: 'codeDescription',
'min-width': 160,
},
{
label: '语言类别',
prop: 'cultureCode',
'width': 130,
},
]
}

158
src/views/merger/mergeredConfig/productClassify/modules/additionCodeDialog.vue

@ -0,0 +1,158 @@
<template>
<md-dialog
:close-on-click-modal="false"
:title="title"
:fullscreen="false"
:visible.sync="dialogVisible"
append-to-body
width="800px"
> <div class="table-page-search-wrapper">
<w-form @keyup.enter.native="searchQueryHandle" layout="inline">
<w-row :gutter="10">
<w-col :span="5" v-for="i in config.searchFields" :key="i.value">
<w-input v-if="i.type === 'input'" v-model="queryParam[i.value]" :placeholder="i.placeholder || i.name" />
<md-select v-if="i.type === 'select'" v-model="queryParam[i.value]" :placeholder="i.placeholder || i.name" filterable clearable>
<md-option
v-for="item in optionsData[i.optionsKey] || {}"
:key="item.value"
:label="item.label"
:value="item.value">
</md-option>
</md-select>
</w-col>
<w-col :span="8" style="justify-content:flex-end">
<span style="float: right; overflow: hidden" class="table-page-search-submitButtons">
<w-button @click="searchQueryHandle" type="primary" icon="search">查询</w-button>
<w-button @click="searchResetHandle" type="primary" style="margin-left: 8px">重置</w-button>
</span>
</w-col>
</w-row>
</w-form>
</div>
<md-table :data="tableData" border size="mini" style="width: 100%" @row-dblclick="rowDblclick">
<md-table-column v-for="col in config.columns" :key="col.prop" :prop="col.prop" :label="col.label" v-bind="{ ...$attrs }"></md-table-column>
</md-table>
</md-dialog>
</template>
<script>
import { postAction, getAction } from '@/api/manage';
import config from './additionCode';
import lodash from 'lodash';
export default {
data() {
return {
config,
queryParam:{},
modelData:{},
tableData:[],
tableDataBackup:[],
dialogVisible: false,
optionsData:{},
title: ''
};
},
methods: {
searchQueryHandle(){
const { additionalCode, cultureCode } = this.queryParam;
if (additionalCode && isNaN(additionalCode)) {
this.$MdMessage({
message: '附加编码只能输入数字',
type: 'warning'
});
return;
}
if (additionalCode && String(additionalCode).length > 6) {
this.$MdMessage({
message: '附加编码不能超过6位',
type: 'warning'
});
return;
}
if( additionalCode || cultureCode) {
const filterData = this.tableDataBackup.filter(item => {
// additionalCode
let additionalCodeMatch = true;
if (!lodash.isEmpty(additionalCode)) {
//
additionalCodeMatch = item.additionalCode === additionalCode;
}
// cultureCode
let cultureCodeMatch = true;
if (!lodash.isEmpty(cultureCode)) {
//
cultureCodeMatch = item.cultureCode === cultureCode;
}
return additionalCodeMatch && cultureCodeMatch;
});
this.tableData = filterData;
} else {
this.tableData = this.tableDataBackup;
}
},
searchResetHandle(){
this.queryParam = {};
this.tableData = this.tableDataBackup;
},
show({data}){
if(!data.hsCode){
this.$message.warning('商品编码不能为空,请维护后重试');
return;
}
this.queryParam = {
additionalCode: data.additionalCode || '',
cultureCode: 'eng'
}
this.dialogVisible = true;
this.title = data.hsCode + '-附加编码';
this.modelData = data;
this.$nextTick(()=>{
this.getDate();
})
},
close(){
this.dialogVisible = false;
this.tableData = [];
},
rowDblclick(row){
this.$emit('confirm', row)
this.close();
},
getDate() {
postAction(process.env.VUE_APP_API_BASE_DOMAIN + '/api-iems-cn/base/tariff/additional/code/v1/get-by-page', {
hscode: this.modelData.hsCode || '',
countryCode: this.modelData.country || '',
pageSize: 999
}).then(res => {
if (res && +res.code === 0) {
this.tableDataBackup = lodash.cloneDeep(res.data.list);
this.searchQueryHandle();
}
});
},
initDict() {
const keyList = ['GLOBAL_TARIFF_LANGUAGE_TYPE'];
getAction(process.env.VUE_APP_API_BASE_DOMAIN + '/api-it-dc/dictionaryDetail/translateWithTenant',
{ dictCodes: keyList.join(',') }
).then(res => {
if (res && +res.code === 0 && res.data && res.data.GLOBAL_TARIFF_LANGUAGE_TYPE) {
const data = res.data.GLOBAL_TARIFF_LANGUAGE_TYPE;
const list = [];
Object.keys(data).forEach(key => {
list.push({
label: data[key],
value: key
})
});
this.optionsData.GLOBAL_TARIFF_LANGUAGE_TYPE = list;
}
});
}
},
mounted() {
this.initDict()
},
};
</script>

66
src/views/merger/mergeredConfig/productClassify/modules/batchAuditPassDialog.vue

@ -0,0 +1,66 @@
<template>
<j-modal class="batch-audit-pass-dialog" :title="title" :width="500" :visible="visible" @cancel="handleCancel">
<div>
<div class="passLabel">
处理意见
</div>
<w-input v-model="remark" type="textarea" :rows="3" />
</div>
<template slot="footer">
<w-button @click="handleCancel">取消</w-button>
<w-button type="primary" @click="handleOk">确定</w-button>
</template>
</j-modal>
</template>
<script>
export default {
name: "batchAuditPassDialog",
data() {
return {
type: '',
visible: false,
title: '',
remark: '同意'
}
},
methods: {
show(obj) {
this.type = obj.type;
this.title = obj.title || '';
this.remark = '同意';
this.visible = true;
},
handleCancel() {
this.remark = '';
this.type = '';
this.visible = false;
},
handleOk() {
this.visible = false;
this.$emit('ok', {
remark: this.remark,
type: this.type
});
}
}
}
</script>
<style lang="less">
.batch-audit-pass-dialog {
.ant-modal-content {
.ant-modal-header {
border: none;
}
.ant-modal-body {
min-height: 80px;
padding: 10px 20px;
}
.ant-modal-footer {
border: none;
padding: 10px 20px;
}
}
}
</style>

78
src/views/merger/mergeredConfig/productClassify/modules/batchAuditUserDialog.vue

@ -0,0 +1,78 @@
<template>
<j-modal class="batch-audit-user-dialog" :title="title" :width="500" :visible="visible" @cancel="handleCancel">
<div>
<div>处理人</div>
<AppprovalUserSelect
v-model="operator"
@change="getOperator"
/>
</div>
<template slot="footer">
<w-button @click="handleCancel">取消</w-button>
<w-button type="primary" @click="handleOk">确定</w-button>
</template>
</j-modal>
</template>
<script>
import AppprovalUserSelect from '@/components/AppprovalUserSelect/index'
export default {
name: "batchAuditUserDialog",
components: {
AppprovalUserSelect
},
data() {
return {
visible: false,
title: '选择审批人',
operator: '',
operatorName:'',
}
},
methods: {
show() {
this.visible = true;
},
getOperator(data){
if (data && data.length > 0) {
this.operatorName = data[0].userName;
} else {
this.operatorName = '';
}
},
handleCancel() {
this.visible = false;
},
handleOk() {
if (!this.operator) {
this.$message.error('处理人必选');
return false;
}
this.visible = false;
this.$emit('ok', {
operator: this.operator,
operatorName: this.operatorName
});
}
}
}
</script>
<style lang="less">
.batch-audit-user-dialog {
.ant-modal-content {
.ant-modal-header {
border: none;
}
.ant-modal-body {
min-height: 80px;
padding: 10px 20px;
}
.ant-modal-footer {
border: none;
padding: 10px 20px;
}
}
}
</style>
Loading…
Cancel
Save