iWare_RawMaterialWarehouse_Web/src/api/modular/main/WmsBase/WmsSubstituteGoodManage.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,114 @@ import { axios } from '@/utils/request' /** * æ¥è¯¢æ¿ä»£å管ç * * @author ly */ export function WmsSubstituteGoodPage (parameter) { return axios({ url: '/WmsSubstituteGood/page', method: 'get', params: parameter }) } /** * æ¿ä»£å管çå表 * * @author ly */ export function WmsSubstituteGoodList (parameter) { return axios({ url: '/WmsSubstituteGood/list', method: 'get', params: parameter }) } /** * æ·»å æ¿ä»£å管ç * * @author ly */ export function WmsSubstituteGoodAdd (parameter) { return axios({ url: '/WmsSubstituteGood/add', method: 'post', data: parameter }) } /** * ç¼è¾æ¿ä»£å管ç * * @author ly */ export function WmsSubstituteGoodEdit (parameter) { return axios({ url: '/WmsSubstituteGood/edit', method: 'post', data: parameter }) } /** * å 餿¿ä»£å管ç * * @author ly */ export function WmsSubstituteGoodDelete (parameter) { return axios({ url: '/WmsSubstituteGood/delete', method: 'post', data: parameter }) } /** * å¯¼åºæ¿ä»£å管ççExcelæä»¶ * * @author ly */ export function WmsSubstituteGoodToExcel (parameter) { return axios({ url: '/WmsSubstituteGood/toExcel', method: 'get', params: parameter, responseType: 'blob' }) } /** * å¯¼å ¥æ¿ä»£å管ççExcelæä»¶ * * @author ly */ export function WmsSubstituteGoodImportExcel (data, parameter) { return axios({ url: '/WmsSubstituteGood/importExcel', method: 'post', data: data, params: parameter }) } /** * ä¸è½½æ¿ä»£å管ççExcelå¯¼å ¥æ¨¡æ¿ * * @author ly */ export function WmsSubstituteGoodDownloadExcelTemplate(parameter) { return axios({ url: '/WmsSubstituteGood/downloadExcelTemplate', method: 'get', params: parameter, responseType: 'blob' }) } iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/addForm.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,103 @@ <template> <a-modal title="æ°å¢æ¿ä»£å管ç" :width="900" :visible="visible" :confirmLoading="confirmLoading" @ok="handleSubmit" @cancel="handleCancel"> <a-spin :spinning="confirmLoading"> <a-form :form="form"> <a-form-item label="æ¿ä»£ç¼å·" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥æ¿ä»£ç¼å·" v-decorator="['substituteCode', {rules: [{required: true, message: '请è¾å ¥æ¿ä»£ç¼å·ï¼'}]}]" /> </a-form-item> <a-form-item label="ç©æç¼å·" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥ç©æç¼å·" v-decorator="['materialCode', {rules: [{required: true, message: '请è¾å ¥ç©æç¼å·ï¼'}]}]" /> </a-form-item> <a-form-item label="ç©æåç§°" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥ç©æåç§°" v-decorator="['materialName', {rules: [{required: true, message: '请è¾å ¥ç©æåç§°ï¼'}]}]" /> </a-form-item> <a-form-item label="æ¿ä»£åç©æç¼å·" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥æ¿ä»£åç©æç¼å·" v-decorator="['substituteMaterialCode', {rules: [{required: true, message: '请è¾å ¥æ¿ä»£åç©æç¼å·ï¼'}]}]" /> </a-form-item> <a-form-item label="æ¿ä»£åç©æåç§°" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥æ¿ä»£åç©æåç§°" v-decorator="['substituteMaterialName', {rules: [{required: true, message: '请è¾å ¥æ¿ä»£åç©æåç§°ï¼'}]}]" /> </a-form-item> <a-form-item label="æ¿ä»£æ¬¡åº" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input-number placeholder="请è¾å ¥æ¿ä»£æ¬¡åº" style="width: 100%" v-decorator="['substituteIndex', {rules: [{required: true, message: '请è¾å ¥æ¿ä»£æ¬¡åºï¼'}]}]" /> </a-form-item> <a-form-item label="æ¯å¦ç¦ç¨" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-switch v-decorator="['isDisabled',{rules: [{ required: true, message: 'è¯·éæ©æ¯å¦ç¦ç¨ï¼' }], valuePropName: 'checked'}]" /> </a-form-item> </a-form> </a-spin> </a-modal> </template> <script> import moment from 'moment' import { WmsSubstituteGoodAdd } from '@/api/modular/main/WmsBase/WmsSubstituteGoodManage' export default { data () { return { labelCol: { xs: { span: 24 }, sm: { span: 5 } }, wrapperCol: { xs: { span: 24 }, sm: { span: 15 } }, visible: false, confirmLoading: false, form: this.$form.createForm(this) } }, methods: { moment, // åå§åæ¹æ³ add (record) { this.visible = true this.$nextTick(() => { }); }, /** * æäº¤è¡¨å */ handleSubmit () { const { form: { validateFields } } = this this.confirmLoading = true validateFields((errors, values) => { if (!errors) { for (const key in values) { if (typeof (values[key]) === 'object') { values[key] = JSON.stringify(values[key]) } } WmsSubstituteGoodAdd(values).then((res) => { if (res.success) { this.$message.success('æ°å¢æå') this.confirmLoading = false this.$emit('ok', values) this.handleCancel() } else { this.$message.error('æ°å¢å¤±è´¥ï¼' + JSON.stringify(res.message)) } }).finally((res) => { this.confirmLoading = false }) } else { this.confirmLoading = false } }) }, handleCancel () { this.form.resetFields() this.visible = false } } } </script> iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/editForm.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,123 @@ <template> <a-modal title="ç¼è¾æ¿ä»£å管ç" :width="900" :visible="visible" :confirmLoading="confirmLoading" @ok="handleSubmit" @cancel="handleCancel"> <a-spin :spinning="confirmLoading"> <a-form :form="form"> <a-form-item label="æ¿ä»£ç¼å·" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥æ¿ä»£ç¼å·" v-decorator="['substituteCode', {rules: [{required: true, message: '请è¾å ¥æ¿ä»£ç¼å·ï¼'}]}]" /> </a-form-item> <a-form-item label="ç©æç¼å·" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥ç©æç¼å·" v-decorator="['materialCode', {rules: [{required: true, message: '请è¾å ¥ç©æç¼å·ï¼'}]}]" /> </a-form-item> <a-form-item label="ç©æåç§°" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥ç©æåç§°" v-decorator="['materialName', {rules: [{required: true, message: '请è¾å ¥ç©æåç§°ï¼'}]}]" /> </a-form-item> <a-form-item label="æ¿ä»£åç©æç¼å·" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥æ¿ä»£åç©æç¼å·" v-decorator="['substituteMaterialCode', {rules: [{required: true, message: '请è¾å ¥æ¿ä»£åç©æç¼å·ï¼'}]}]" /> </a-form-item> <a-form-item label="æ¿ä»£åç©æåç§°" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input placeholder="请è¾å ¥æ¿ä»£åç©æåç§°" v-decorator="['substituteMaterialName', {rules: [{required: true, message: '请è¾å ¥æ¿ä»£åç©æåç§°ï¼'}]}]" /> </a-form-item> <a-form-item label="æ¿ä»£æ¬¡åº" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-input-number placeholder="请è¾å ¥æ¿ä»£æ¬¡åº" style="width: 100%" v-decorator="['substituteIndex', {rules: [{required: true, message: '请è¾å ¥æ¿ä»£æ¬¡åºï¼'}]}]" /> </a-form-item> <a-form-item label="æ¯å¦ç¦ç¨" :labelCol="labelCol" :wrapperCol="wrapperCol" has-feedback> <a-switch v-decorator="['isDisabled',{rules: [{ required: true, message: 'è¯·éæ©æ¯å¦ç¦ç¨ï¼' }], valuePropName: 'checked'}]" /> </a-form-item> <a-form-item v-show="false"><a-input v-decorator="['id']" /></a-form-item> </a-form> </a-spin> </a-modal> </template> <script> import moment from 'moment' import { WmsSubstituteGoodEdit } from '@/api/modular/main/WmsBase/WmsSubstituteGoodManage' export default { data () { return { Id: 0, labelCol: { xs: { span: 24 }, sm: { span: 5 } }, wrapperCol: { xs: { span: 24 }, sm: { span: 15 } }, record: {}, visible: false, confirmLoading: false, form: this.$form.createForm(this) } }, methods: { moment, // åå§åæ¹æ³ edit (record) { this.visible = true; this.Id = record.id; this.$nextTick(() => { }); //深度æ·è´ ç§»é¤VUEççå¬ï¼é²æ¢INDEX页é¢å¼åå¨ this.record = JSON.parse(JSON.stringify(record)) this.$nextTick(() => { this.form.setFieldsValue( { id: record.id, substituteCode: record.substituteCode, materialCode: record.materialCode, materialName: record.materialName, substituteMaterialCode: record.substituteMaterialCode, substituteMaterialName: record.substituteMaterialName, substituteIndex: record.substituteIndex, isDisabled: record.isDisabled } ) }) }, handleSubmit () { const { form: { validateFields } } = this this.confirmLoading = true validateFields((errors, values) => { if (!errors) { for (const key in values) { if (values[key] == null) continue if (typeof (values[key]) === 'object') { values[key] = JSON.stringify(values[key]) this.record[key] = values[key] } else { this.record[key] = values[key] } } WmsSubstituteGoodEdit(this.record).then((res) => { if (res.success) { this.$message.success('ç¼è¾æå') this.confirmLoading = false this.$emit('ok', this.record) this.handleCancel() } else { this.$message.error('ç¼è¾å¤±è´¥ï¼' + JSON.stringify(res.message)) } }).finally((res) => { this.confirmLoading = false }) }else{ this.confirmLoading = false } }); }, handleCancel () { this.form.resetFields() this.visible = false } } } </script> iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/excelForm.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,181 @@ <template> <a-modal :width="850" :destroyOnClose="true" :visible="visible" :forceRender="true" title="æ¹éå¯¼å ¥" cancelText="åæ¶ä¸ä¼ " okText="å¼å§ä¸ä¼ " @cancel="handleCancel" @ok="handleSubmit"> <a-spin :spinning="confirmLoading"> <a-row :span="24"> <span>è¯·éæ©è¦å¯¼å ¥çæ°æ®æä»¶ï¼Excelæ ¼å¼ï¼</span> </a-row> <p></p> <a-row> <a-col :span="16"> <a-upload-dragger accept=".xlsx,.xls" :multiple="false" :customRequest="customRequest" @change="handleChange" :beforeUpload="beforeUpload"> <a-icon style="font-size: 40px;" type="cloud-upload" /> </a-upload-dragger> </a-col> <!--<a-col :span="8"> <span>å¯¼å ¥æ¨¡å¼ï¼</span> <a-select style="width: 130px" placeholder="è¯·éæ©å¯¼å ¥æ¨¡å¼" v-model="importExcelType"> <a-select-option v-for="(item,index) in importExcelTypeData" :key="index" :value="item.code">{{ item.name }} </a-select-option> </a-select> </a-col>--> </a-row> <a-row :span="24"> <!--<a-button @click="showDemand" style="width: 150px;text-align: left;" type="link" v-show="!detailed"> ç¹å»æ¥çæä»¶ä¸ä¼ è¦æ± </a-button>--> <span>ã</span> <a-button style="width: 90px;text-align: left;" @click="wmsSubstituteGoodDownloadExcelTemplate" type="link">ä¸è½½å¯¼å ¥æ¨¡æ¿</a-button>ï¼å¡«åå¹¶ä¸ä¼ <span>ã</span> <a-button @click="showDemand" style="width: 150px;text-align: left;" type="link" v-show="detailed"> æ¶èµ· </a-button> </a-row> <a-row v-show="detailed" style="background: #fef4e8; height: 30px;" :span="24"> <a-breadcrumb> <a-breadcrumb-item style="line-height: 30px;color: #faad14;margin-left: 18px;">æä»¶ä¸ä¼ è¦æ±</a-breadcrumb-item> </a-breadcrumb> </a-row> <pre v-show="detailed"> <div v-html="demandText"></div> </pre> <a-table v-show="detailed" :columns="columns" :data-source="dataList" :rowKey="(record) => record.processID" :pagination="false"></a-table> <pre v-show="detailed"> <div v-html="columnText"></div> </pre> </a-spin> </a-modal> </template> <script> import { downloadFile, checkFile, parseExcelFieldText, parseDemandText } from '@/utils/util' import { WmsSubstituteGoodImportExcel, WmsSubstituteGoodDownloadExcelTemplate} from '@/api/modular/main/WmsBase/WmsSubstituteGoodManage' import { sysExcelTemplateGetColumnList } from '@/api/modular/system/excelTemplateManage' export default { components: { }, data() { return { visible: false, detailed: false, confirmLoading: false, fileList: [], importExcelTypeData: [], importExcelType: '1', uploadFile: null, columns: [], dataList: [], demandText:'', columnText: '' } }, methods: { index() { this.visible = true; this.importExcelTypeData = this.$options.filters['dictData']('import_excel_type') this.demandText = parseDemandText("wmsSubstituteGoodDownloadExcelTemplate") window.downloadFile = this.wmsSubstituteGoodDownloadExcelTemplate; this.getTable(); }, showDemand() { this.detailed = !this.detailed; }, customRequest(document) { this.uploadFile = document }, getTable() { sysExcelTemplateGetColumnList({className: "WmsSubstituteGood"}).then(res => { if (res.success) { this.columns =[]; this.dataList = [{}]; res.data.forEach(x => { this.columns.push({ dataIndex: x.columnName, key: x.columnName, title: x.columnComment }); this.dataList[0][x.columnName] = x.isRequired ? "å¿ å¡«" : "éå¿ å¡«" }); this.columnText = parseExcelFieldText(res.data); } }); }, beforeUpload(fileInfo) { let res = checkFile(fileInfo, 1073741824, ['.xlsx', '.xls']); if (!res.success) { this.$message.warning(res.msg) return false } setTimeout(() => {this.uploadFile.onSuccess(this.uploadFile.file)}, 1000) }, handleChange(fileInfo) { if (fileInfo.file.status === 'error') { fileInfo.fileList.splice(0, 1) } if (fileInfo.file.status === 'done') { if (fileInfo.fileList.length > 1) { fileInfo.fileList.splice(0, 1) } this.fileList = fileInfo.file } }, handleSubmit() { this.confirmLoading = true const formData = new FormData() formData.append('file', this.uploadFile.file) WmsSubstituteGoodImportExcel(formData, {importExcelType: this.importExcelType}).then(res => { this.$message.success('æä½æå') this.confirmLoading = false this.$emit('ok', []) this.handleCancel() }).finally((res)=>{this.confirmLoading = false}) }, handleCancel() { this.visible = false this.detailed = false }, wmsSubstituteGoodDownloadExcelTemplate() { WmsSubstituteGoodDownloadExcelTemplate({version: "v2"}).then((res) => { downloadFile(res); }).catch((err) => { this.$message.error('ä¸è½½é误ï¼è·åæä»¶æµé误' + err) }) } } } </script> <style scoped> ::v-deep .ant-upload.ant-upload-drag { position: relative; width: 140px; height: 135px; text-align: center; background: #fafafa; border: 1px dashed #d9d9d9; border-radius: 2px; cursor: pointer; -webkit-transition: border-color 0.3s; transition: border-color 0.3s; } ::v-deep .ant-btn:focus:not(.ant-btn-primary):not(.ant-btn-danger), .ant-btn:hover:not(.ant-btn-primary):not(.ant-btn-danger) { color: #ffc53d; border-color: white; } </style> iWare_RawMaterialWarehouse_Web/src/views/main/WmsBase/WmsSubstituteGood/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,537 @@ <template> <div ref="boxOutWrap" class="boxOutWrap"> <div ref="boxForm" class="boxForm"> <a-card :bordered="false" :bodyStyle="tstyle"> <div class="table-page-search-wrapper" v-if="hasPerm('WmsSubstituteGood:page')"> <a-form layout="inline"> <a-row :gutter="48"> <a-col :md="8" :sm="24"> <a-form-item label="æ¿ä»£ç¼å·"> <a-input v-model="queryParam.substituteCode" allow-clear placeholder="请è¾å ¥æ¿ä»£ç¼å·"/> </a-form-item> </a-col> <a-col :md="8" :sm="24"> <a-form-item label="ç©æç¼å·"> <a-input v-model="queryParam.materialCode" allow-clear placeholder="请è¾å ¥ç©æç¼å·"/> </a-form-item> </a-col><template v-if="advanced"> <a-col :md="8" :sm="24"> <a-form-item label="ç©æåç§°"> <a-input v-model="queryParam.materialName" allow-clear placeholder="请è¾å ¥ç©æåç§°"/> </a-form-item> </a-col> <a-col :md="8" :sm="24"> <a-form-item label="æ¿ä»£åç©æç¼å·"> <a-input v-model="queryParam.substituteMaterialCode" allow-clear placeholder="请è¾å ¥æ¿ä»£åç©æç¼å·"/> </a-form-item> </a-col> <a-col :md="8" :sm="24"> <a-form-item label="æ¿ä»£åç©æåç§°"> <a-input v-model="queryParam.substituteMaterialName" allow-clear placeholder="请è¾å ¥æ¿ä»£åç©æåç§°"/> </a-form-item> </a-col><a-col :md="8" :sm="24"> <a-form-item label="æ¿ä»£æ¬¡åº"> <a-input-number v-model="queryParam.substituteIndex" style="width: 100%" allow-clear placeholder="请è¾å ¥æ¿ä»£æ¬¡åº"/> </a-form-item> </a-col> <a-col :md="8" :sm="24"> <a-form-item label="æ¯å¦ç¦ç¨"> <a-select :allowClear="true" style="width: 100%" v-model="queryParam.isDisabled" placeholder="è¯·éæ©æ¯å¦ç¦ç¨"> <a-select-option v-for="(item,index) in isDisabledData" :key="index" :value="item.code">{{ item.name }}</a-select-option> </a-select> </a-form-item> </a-col> <!--å¹´ææ¥æ¶åç§--> <!--æ¶é´èå´--> <a-col :md="8" :sm="24"> <a-form-item label="å建æ¶é´"> <a-range-picker style="width: 100%" :placeholder="['å¼å§æ¶é´', 'ç»ææ¶é´']" :show-time="{ format: 'HH:mm:ss', defaultValue: [moment('00:00:00', 'HH:mm:ss'),moment('23:59:59', 'HH:mm:ss')]}" v-model="queryParam.createdTime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" @change="onChangecreatedTime"/> </a-form-item> </a-col> <!--å¹´ææ¥æ¶åç§--> <!--æ¶é´èå´--> <a-col :md="8" :sm="24"> <a-form-item label="æ´æ°æ¶é´"> <a-range-picker style="width: 100%" :placeholder="['å¼å§æ¶é´', 'ç»ææ¶é´']" :show-time="{ format: 'HH:mm:ss', defaultValue: [moment('00:00:00', 'HH:mm:ss'),moment('23:59:59', 'HH:mm:ss')]}" v-model="queryParam.updatedTime" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" @change="onChangeupdatedTime"/> </a-form-item> </a-col> <a-col :md="8" :sm="24"> <a-form-item label="å建è åç§°"> <a-input v-model="queryParam.createdUserName" allow-clear placeholder="请è¾å ¥å建è åç§°"/> </a-form-item> </a-col> <a-col :md="8" :sm="24"> <a-form-item label="ä¿®æ¹è åç§°"> <a-input v-model="queryParam.updatedUserName" allow-clear placeholder="请è¾å ¥ä¿®æ¹è åç§°"/> </a-form-item> </a-col> </template> <a-col :md="8" :sm="24" > <span class="table-page-search-submitButtons"> <a-button type="primary" @click="$refs.table.refresh(true)" >æ¥è¯¢</a-button> <a-button style="margin-left: 8px" @click="() => queryParam = {}">éç½®</a-button> <a @click="toggleAdvanced" style="margin-left: 8px"> {{ advanced ? 'æ¶èµ·' : 'å±å¼' }} <a-icon :type="advanced ? 'up' : 'down'"/> </a> </span> </a-col> </a-row> </a-form> </div> </a-card> </div> <a-card :bordered="false"> <s-table ref="table" :columns="columns" :data="loadData" :alert="true" @changeTablePage="pageInfo = $event" :scroll="{x: true,y:tableHeight}" :rowKey="(record) => record.id" :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"> <template class="table-operator" slot="operator" v-if="hasPerm('WmsSubstituteGood:add')" > <div ref="actionBar" class="actionBar"> <a-button type="info" v-if="hasPerm('sysExcelTemplate:importExcel')" icon="upload" @click="$refs.excelForm.index()"> å¯¼å ¥ </a-button> <a-button type="info" v-if="hasPerm('WmsSubstituteGood:exportExcel')" icon="download" @click="WmsSubstituteGoodToExcel()"> å¯¼åº </a-button> <a-button type="primary" v-if="hasPerm('WmsSubstituteGood:add')" icon="plus" @click="$refs.addForm.add()">æ°å¢æ¿ä»£å管ç</a-button> </div> </template> <span slot="isDisabledscopedSlots" slot-scope="text"> <div v-if="text===true "> <a-tag color="green">æ¯</a-tag> </div> <div v-else-if="text==false"> <a-tag color="volcano">å¦</a-tag> </div> <div v-else=""></div> </span> <span slot="action" slot-scope="text, record"> <a v-if="hasPerm('WmsSubstituteGood:edit')" @click="$refs.editForm.edit(record)">ç¼è¾</a> <a-divider type="vertical" v-if="hasPerm('WmsSubstituteGood:edit') & hasPerm('WmsSubstituteGood:delete')"/> <a-popconfirm v-if="hasPerm('WmsSubstituteGood:delete')" placement="topRight" title="确认å é¤ï¼" @confirm="() => WmsSubstituteGoodDelete(record)"> <a>å é¤</a> </a-popconfirm> </span> </s-table> <add-form ref="addForm" @ok="handleOk" /> <edit-form ref="editForm" @ok="handleOk" /> <excel-form ref="excelForm" @ok="handleOk" /> </a-card> </div> </template> <script> import { STable } from '@/components' import moment from 'moment' import { WmsSubstituteGoodPage, WmsSubstituteGoodDelete, WmsSubstituteGoodToExcel } from '@/api/modular/main/WmsBase/WmsSubstituteGoodManage' //èªå®ä¹tableé«åº¦ import setTableHtMixin from '@/mixins/handleTableHt.js' import addForm from './addForm.vue' import { exportExcel } from '@/utils/exportToExcel' import { downloadFile } from '@/utils/util' import editForm from './editForm.vue' import excelForm from './excelForm.vue' export default { mixins: [setTableHtMixin], components: { STable, addForm, editForm, excelForm }, data () { return { advanced: false, // é«çº§æç´¢ å±å¼/å ³é queryParam: {}, pageInfo: { current: 1, pageSize: 10 }, columns: [ { title:'åºå·', width: '60px', align: 'center', customRender: (text, record, index) => `${index + 1 + (this.pageInfo.current - 1) * this.pageInfo.pageSize}` }, { title: 'æ¿ä»£ç¼å·', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'substituteCode' }, { title: 'ç©æç¼å·', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'materialCode' }, { title: 'ç©æåç§°', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'materialName' }, { title: 'æ¿ä»£åç©æç¼å·', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '140px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '140px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'substituteMaterialCode' }, { title: 'æ¿ä»£åç©æåç§°', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '140px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '140px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'substituteMaterialName' }, { title: 'æ¿ä»£æ¬¡åº', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'substituteIndex' }, { title: 'æ¯å¦ç¦ç¨', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'isDisabled', scopedSlots: { customRender: 'isDisabledscopedSlots' } }, { title: 'å建æ¶é´', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'createdTime' }, { title: 'æ´æ°æ¶é´', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'updatedTime' }, { title: 'å建è åç§°', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'createdUserName' }, { title: 'ä¿®æ¹è åç§°', align: 'center', customHeaderCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, customCell: () => { return { style: { 'min-width': '120px'//æå°å宽设置 } } }, sorter: true, dataIndex: 'updatedUserName' } ], tstyle: { 'padding-bottom': '0px', 'margin-bottom': '10px' }, // å è½½æ°æ®æ¹æ³ å¿ é¡»ä¸º Promise 对象 loadData: parameter => { return WmsSubstituteGoodPage(Object.assign(parameter, this.switchingDate())).then((res) => { return res.data }) }, selectedRowKeys: [], selectedRows: [] } }, created () { if (this.hasPerm('WmsSubstituteGood:edit') || this.hasPerm('WmsSubstituteGood:delete')) { this.columns.push({ title: 'æä½', width: '150px', dataIndex: 'action', scopedSlots: { customRender: 'action' } }) } const path = this.$route.path const columnStr = window.localStorage.getItem(path) if(columnStr) { var _columns = JSON.parse(columnStr) this.columns.forEach(element => { var fObj = _columns.find((item, index) => { return item.dataIndex === element.dataIndex; }) if(fObj!=undefined && fObj!=null){ element.checked=fObj.checked; } }); } const isDisabledOption = this.$options this.isDisabledData = isDisabledOption.filters['dictData']('yes_true_false') this.handleTableHt() //è®¾ç½®ä¸»è¡¨è¡¨æ ¼é«åº¦ window.addEventListener( 'resize', () => { this.handleTableHt() // çå¬å±å¹å¤§å°æ¹åè¡¨æ ¼é«åº¦ }, false ) }, methods: { moment, /** * æ¥è¯¢åæ°ç»è£ */ switchingDate () { const obj = JSON.parse(JSON.stringify(this.queryParam)) return obj }, WmsSubstituteGoodDelete (record) { WmsSubstituteGoodDelete(record).then((res) => { if (res.success) { this.$message.success('å 餿å') this.$refs.table.refresh() } else { this.$message.error('å é¤å¤±è´¥') // + res.message } }) }, WmsSubstituteGoodToExcel() { this.loading = true let entozh = {}; const path = this.$route.path; if (window.localStorage.getItem(path)) { JSON.parse(window.localStorage.getItem(path)).forEach(item => { if (item.dataIndex != 'action' && item.checked) { entozh[item.dataIndex] = item.title } }) } else { //ç´æ¥ç¹å¯¼åº this.columns.forEach(item => { if (item.dataIndex != 'action') { entozh[item.dataIndex] = item.title } }) } WmsSubstituteGoodPage(Object.assign({ pageSize: 100000, pageIndex: 1 }, this.queryParam)).then((res) => { this.loading = false; //éè¦æªåæ¥æçåæ®µ var arrDataCutout = this.columns.filter(v => v.customCutout == true); res.data.rows.forEach(item => { var arrKeys = Object.keys(item); arrKeys.forEach(key => { var strFieldDic = key + 'Data'; //æä¸¾è½¬å¼ if (this[strFieldDic] && this[strFieldDic].length > 0) { let arrFieldDic = this[strFieldDic].filter(v => String(v.code) == String(item[key])); if (arrFieldDic.length > 0) { item[key] = arrFieldDic[0]?.name || '没ææä¸¾å¼'; } } // æ¥ææªå if (arrDataCutout.length > 0) { arrDataCutout.forEach(itemIn => { if (key == itemIn.dataIndex && item[key]) { item[key] = item[key].split(" ")[0] } }) } }); }) exportExcel(res.data.rows, entozh, "xlsx", `${this.$route.meta.title}`) }).catch((err) => { this.loading = false this.$message.error('ä¸è½½é误ï¼è·åæä»¶æµé误' + err) }) }, toggleAdvanced () { this.advanced = !this.advanced this.handleTableHt() //è®¾ç½®ä¸»è¡¨è¡¨æ ¼é«åº¦ }, onChangecreatedTime(date, dateString) { this.queryParam.createdTime = dateString }, onChangeupdatedTime(date, dateString) { this.queryParam.updatedTime = dateString }, handleOk () { this.$refs.table.refresh() }, onSelectChange (selectedRowKeys, selectedRows) { this.selectedRowKeys = selectedRowKeys this.selectedRows = selectedRows } } } </script> <style lang="less"> .table-operator { margin-bottom: 18px; } button { margin-right: 8px; } </style> iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/Dto/WmsSubstituteGoodInput.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,215 @@ using Admin.NET.Core; using Admin.NET.Core.Service; using System.ComponentModel.DataAnnotations; namespace Admin.NET.Application { /// <summary> /// æ¿ä»£åç®¡çæ¥è¯¢åæ° /// </summary> public class WmsSubstituteGoodSearch : PageInputBase { /// <summary> /// æ¿ä»£ç¼å· /// </summary> public virtual string SubstituteCode { get; set; } /// <summary> /// ç©æç¼å· /// </summary> public virtual string MaterialCode { get; set; } /// <summary> /// ç©æåç§° /// </summary> public virtual string MaterialName { get; set; } /// <summary> /// æ¿ä»£åç©æç¼å· /// </summary> public virtual string SubstituteMaterialCode { get; set; } /// <summary> /// æ¿ä»£åç©æåç§° /// </summary> public virtual string SubstituteMaterialName { get; set; } /// <summary> /// æ¿ä»£æ¬¡åº /// </summary> public virtual int? SubstituteIndex { get; set; } /// <summary> /// æ¯å¦ç¦ç¨ /// </summary> public virtual bool? IsDisabled { get; set; } /// <summary> /// å建æ¶é´ /// </summary> public virtual List<string> CreatedTime { get; set; } /// <summary> /// æ´æ°æ¶é´ /// </summary> public virtual List<string> UpdatedTime { get; set; } /// <summary> /// å建è åç§° /// </summary> public virtual string CreatedUserName { get; set; } /// <summary> /// ä¿®æ¹è åç§° /// </summary> public virtual string UpdatedUserName { get; set; } } /// <summary> /// æ¿ä»£å管çä¸å页æ¥è¯¢åæ° /// </summary> public class WmsSubstituteGoodSearchNonPage : PageInputNonPageBase { /// <summary> /// æ¿ä»£ç¼å· /// </summary> public virtual string SubstituteCode { get; set; } /// <summary> /// ç©æç¼å· /// </summary> public virtual string MaterialCode { get; set; } /// <summary> /// ç©æåç§° /// </summary> public virtual string MaterialName { get; set; } /// <summary> /// æ¿ä»£åç©æç¼å· /// </summary> public virtual string SubstituteMaterialCode { get; set; } /// <summary> /// æ¿ä»£åç©æåç§° /// </summary> public virtual string SubstituteMaterialName { get; set; } /// <summary> /// æ¿ä»£æ¬¡åº /// </summary> public virtual int? SubstituteIndex { get; set; } /// <summary> /// æ¯å¦ç¦ç¨ /// </summary> public virtual bool? IsDisabled { get; set; } /// <summary> /// å建æ¶é´ /// </summary> public virtual List<DateTimeOffset>? CreatedTime { get; set; } /// <summary> /// æ´æ°æ¶é´ /// </summary> public virtual List<DateTimeOffset>? UpdatedTime { get; set; } /// <summary> /// å建è åç§° /// </summary> public virtual string CreatedUserName { get; set; } /// <summary> /// ä¿®æ¹è åç§° /// </summary> public virtual string UpdatedUserName { get; set; } } /// <summary> /// æ¿ä»£å管çè¾å ¥åæ° /// </summary> public class WmsSubstituteGoodInput { /// <summary> /// æ¿ä»£ç¼å· /// </summary> [Required(ErrorMessage = "æ¿ä»£ç¼å·ä¸è½ä¸ºç©º")] public virtual string SubstituteCode { get; set; } /// <summary> /// ç©æç¼å· /// </summary> [Required(ErrorMessage = "ç©æç¼å·ä¸è½ä¸ºç©º")] public virtual string MaterialCode { get; set; } /// <summary> /// ç©æåç§° /// </summary> [Required(ErrorMessage = "ç©æåç§°ä¸è½ä¸ºç©º")] public virtual string MaterialName { get; set; } /// <summary> /// æ¿ä»£åç©æç¼å· /// </summary> [Required(ErrorMessage = "æ¿ä»£åç©æç¼å·ä¸è½ä¸ºç©º")] public virtual string SubstituteMaterialCode { get; set; } /// <summary> /// æ¿ä»£åç©æåç§° /// </summary> [Required(ErrorMessage = "æ¿ä»£åç©æåç§°ä¸è½ä¸ºç©º")] public virtual string SubstituteMaterialName { get; set; } /// <summary> /// æ¿ä»£æ¬¡åº /// </summary> [Required(ErrorMessage = "æ¿ä»£æ¬¡åºä¸è½ä¸ºç©º")] public virtual int SubstituteIndex { get; set; } /// <summary> /// æ¯å¦ç¦ç¨ /// </summary> [Required(ErrorMessage = "æ¯å¦ç¦ç¨ä¸è½ä¸ºç©º")] public virtual bool IsDisabled { get; set; } } /// <summary> /// æ¿ä»£åç®¡çæ°å¢åæ° /// </summary> public class AddWmsSubstituteGoodInput : WmsSubstituteGoodInput { } /// <summary> /// æ¿ä»£å管çå é¤åæ° /// </summary> public class DeleteWmsSubstituteGoodInput : BaseId { } /// <summary> /// æ¿ä»£åç®¡çæ´æ°åæ° /// </summary> public class UpdateWmsSubstituteGoodInput : WmsSubstituteGoodInput { /// <summary> /// Idä¸»é® /// </summary> [Required(ErrorMessage = "Id主é®ä¸è½ä¸ºç©º")] public long? Id { get; set; } } /// <summary> /// æ¿ä»£å管çè·ååä¸ªåæ° /// </summary> public class QueryeWmsSubstituteGoodInput : BaseId { } } iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/Dto/WmsSubstituteGoodOutput.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,72 @@ using Admin.NET.Core.Util.LowCode.Dto; using System; namespace Admin.NET.Application { /// <summary> /// æ¿ä»£å管çè¾åºåæ° /// </summary> public class WmsSubstituteGoodOutput { /// <summary> /// æ¿ä»£ç¼å· /// </summary> public string SubstituteCode { get; set; } /// <summary> /// ç©æç¼å· /// </summary> public string MaterialCode { get; set; } /// <summary> /// ç©æåç§° /// </summary> public string MaterialName { get; set; } /// <summary> /// æ¿ä»£åç©æç¼å· /// </summary> public string SubstituteMaterialCode { get; set; } /// <summary> /// æ¿ä»£åç©æåç§° /// </summary> public string SubstituteMaterialName { get; set; } /// <summary> /// æ¿ä»£æ¬¡åº /// </summary> public int SubstituteIndex { get; set; } /// <summary> /// æ¯å¦ç¦ç¨ /// </summary> public bool IsDisabled { get; set; } /// <summary> /// Idä¸»é® /// </summary> public long? Id { get; set; } /// <summary> /// å建æ¶é´ /// </summary> public DateTimeOffset? CreatedTime { get; set; } /// <summary> /// æ´æ°æ¶é´ /// </summary> public DateTimeOffset? UpdatedTime { get; set; } /// <summary> /// å建è åç§° /// </summary> public string CreatedUserName { get; set; } /// <summary> /// ä¿®æ¹è åç§° /// </summary> public string UpdatedUserName { get; set; } } } iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/IWmsSubstituteGoodService.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ using Admin.NET.Core; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; namespace Admin.NET.Application { public interface IWmsSubstituteGoodService { Task<WmsSubstituteGoodOutput> Get([FromQuery] QueryeWmsSubstituteGoodInput input); Task<List<WmsSubstituteGoodOutput>> List([FromQuery] WmsSubstituteGoodInput input); Task<PageResult<WmsSubstituteGoodOutput>> Page([FromQuery] WmsSubstituteGoodSearch input); Task<List<WmsSubstituteGoodOutput>> ListNonPageAsync([FromQuery] WmsSubstituteGoodSearchNonPage input); Task Add(AddWmsSubstituteGoodInput input); Task Update(UpdateWmsSubstituteGoodInput input); Task Delete(DeleteWmsSubstituteGoodInput input); Task<int> ImportExcelAsync(IFormFile file); IActionResult DownloadExcelTemplate(string version); } } iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/Map/WmsSubstituteGoodMapper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ using Mapster; using Admin.NET.Core; namespace Admin.NET.Application { public class WmsSubstituteGoodMapper : IRegister { public void Register(TypeAdapterConfig config) { config.ForType<AddWmsSubstituteGoodInput, WmsSubstituteGood>() ; config.ForType<UpdateWmsSubstituteGoodInput, WmsSubstituteGood>() ; config.ForType<WmsSubstituteGood, WmsSubstituteGoodOutput>() ; } } } iWare_RawMaterialWarehouse_Wms/Admin.NET.Application/Service/WmsBase/WmsSubstituteGood/WmsSubstituteGoodService.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,481 @@ using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Admin.NET.Core; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using Microsoft.AspNetCore.Http; using System.Text; using System.Web; using System.ComponentModel; using System.Data; namespace Admin.NET.Application { /// <summary> /// æ¿ä»£å管çæå¡ /// </summary> [ApiDescriptionSettings("WmsBase", Name = "WmsSubstituteGood", Order = 100)] [Route("api")] public class WmsSubstituteGoodService : IWmsSubstituteGoodService, IDynamicApiController, ITransient { private readonly IRepository<WmsSubstituteGood,MasterDbContextLocator> _wmsSubstituteGoodRep; private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep; private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); public WmsSubstituteGoodService( IRepository<WmsSubstituteGood,MasterDbContextLocator> wmsSubstituteGoodRep ,IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep ,IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService ) { _wmsSubstituteGoodRep = wmsSubstituteGoodRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; } /// <summary> /// å页æ¥è¯¢æ¿ä»£å管ç /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpGet("WmsSubstituteGood/page")] public async Task<PageResult<WmsSubstituteGoodOutput>> Page([FromQuery] WmsSubstituteGoodSearch input) { var wmsSubstituteGoods = await _wmsSubstituteGoodRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.SubstituteCode), u => u.SubstituteCode == input.SubstituteCode) .Where(!string.IsNullOrEmpty(input.MaterialCode), u => u.MaterialCode == input.MaterialCode) .Where(!string.IsNullOrEmpty(input.MaterialName), u => u.MaterialName == input.MaterialName) .Where(!string.IsNullOrEmpty(input.SubstituteMaterialCode), u => u.SubstituteMaterialCode == input.SubstituteMaterialCode) .Where(!string.IsNullOrEmpty(input.SubstituteMaterialName), u => u.SubstituteMaterialName == input.SubstituteMaterialName) .Where(input.SubstituteIndex != null, u => u.SubstituteIndex == input.SubstituteIndex) .Where(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled) .Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(input.CreatedUserName), u => u.CreatedUserName == input.CreatedUserName) .Where(!string.IsNullOrEmpty(input.UpdatedUserName), u => u.UpdatedUserName == input.UpdatedUserName) .OrderBy(PageInputOrder.OrderBuilder<WmsSubstituteGoodSearch>(input)) .ProjectToType<WmsSubstituteGoodOutput>() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsSubstituteGoods; } /// <summary> /// ä¸å页æ¥è¯¢æ¿ä»£å管çå表 /// </summary> /// <param name="input">æ¿ä»£åç®¡çæ¥è¯¢åæ°</param> /// <returns>(æ¿ä»£å管ç)å®ä¾å表</returns> [HttpGet("WmsSubstituteGood/listNonPage")] public async Task<List<WmsSubstituteGoodOutput>> ListNonPageAsync([FromQuery] WmsSubstituteGoodSearchNonPage input) { var pSubstituteCode = input.SubstituteCode?.Trim() ?? ""; var pMaterialCode = input.MaterialCode?.Trim() ?? ""; var pMaterialName = input.MaterialName?.Trim() ?? ""; var pSubstituteMaterialCode = input.SubstituteMaterialCode?.Trim() ?? ""; var pSubstituteMaterialName = input.SubstituteMaterialName?.Trim() ?? ""; var pSubstituteIndex = input.SubstituteIndex; var pIsDisabled = input.IsDisabled; var pCreatedTime = input.CreatedTime; var pUpdatedTime = input.UpdatedTime; var pCreatedUserName = input.CreatedUserName?.Trim() ?? ""; var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? ""; var wmsSubstituteGoods = await _wmsSubstituteGoodRep.DetachedEntities .Where(!string.IsNullOrEmpty(pSubstituteCode), u => u.SubstituteCode == pSubstituteCode) .Where(!string.IsNullOrEmpty(pMaterialCode), u => u.MaterialCode == pMaterialCode) .Where(!string.IsNullOrEmpty(pMaterialName), u => u.MaterialName == pMaterialName) .Where(!string.IsNullOrEmpty(pSubstituteMaterialCode), u => u.SubstituteMaterialCode == pSubstituteMaterialCode) .Where(!string.IsNullOrEmpty(pSubstituteMaterialName), u => u.SubstituteMaterialName == pSubstituteMaterialName) .Where(pSubstituteIndex != null, u => u.SubstituteIndex == pSubstituteIndex) .Where(pIsDisabled != null, u => u.IsDisabled == pIsDisabled) .Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(pCreatedUserName), u => u.CreatedUserName == pCreatedUserName) .Where(!string.IsNullOrEmpty(pUpdatedUserName), u => u.UpdatedUserName == pUpdatedUserName) .OrderBy(PageInputOrder.OrderNonPageBuilder(input)) .ProjectToType<WmsSubstituteGoodOutput>() .ToListAsync(); return wmsSubstituteGoods; } /// <summary> /// è·åæ¿ä»£å管ç /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpGet("WmsSubstituteGood/detail")] public async Task<WmsSubstituteGoodOutput> Get([FromQuery] QueryeWmsSubstituteGoodInput input) { return (await _wmsSubstituteGoodRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt<WmsSubstituteGoodOutput>(); } /// <summary> /// è·åæ¿ä»£å管çå表 /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpGet("WmsSubstituteGood/list")] public async Task<List<WmsSubstituteGoodOutput>> List([FromQuery] WmsSubstituteGoodInput input) { return await _wmsSubstituteGoodRep.DetachedEntities.ProjectToType<WmsSubstituteGoodOutput>().ToListAsync(); } #region å¢ãå ãæ¹ /// <summary> /// å¢å æ¿ä»£å管ç /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpPost("WmsSubstituteGood/add")] public async Task Add(AddWmsSubstituteGoodInput input) { var wmsSubstituteGood = input.Adapt<WmsSubstituteGood>(); //éªè¯ await CheckExisit(wmsSubstituteGood); wmsSubstituteGood.CreatedUserId = wmsSubstituteGood.UpdatedUserId = SysHelper.GetUserId(); wmsSubstituteGood.CreatedUserName = wmsSubstituteGood.UpdatedUserName = SysHelper.GetUserName(); wmsSubstituteGood.CreatedTime = wmsSubstituteGood.UpdatedTime = SysHelper.GetNowTime(); await _wmsSubstituteGoodRep.InsertAsync(wmsSubstituteGood); } /// <summary> /// å 餿¿ä»£å管ç /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpPost("WmsSubstituteGood/delete")] public async Task Delete(DeleteWmsSubstituteGoodInput input) { var wmsSubstituteGood = await _wmsSubstituteGoodRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _wmsSubstituteGoodRep.DeleteAsync(wmsSubstituteGood); } /// <summary> /// æ´æ°æ¿ä»£å管ç /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpPost("WmsSubstituteGood/edit")] public async Task Update(UpdateWmsSubstituteGoodInput input) { var isExist = await _wmsSubstituteGoodRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var wmsSubstituteGood = input.Adapt<WmsSubstituteGood>(); //éªè¯ await CheckExisit(wmsSubstituteGood,true); wmsSubstituteGood.UpdatedUserId = SysHelper.GetUserId(); wmsSubstituteGood.UpdatedUserName = SysHelper.GetUserName(); wmsSubstituteGood.UpdatedTime = SysHelper.GetNowTime(); await _wmsSubstituteGoodRep.UpdateAsync(wmsSubstituteGood,ignoreNullValues:true); } #endregion #region å¯¼å ¥ /// <summary> /// Excel模æ¿å¯¼å ¥æ¿ä»£å管çåè½ /// </summary> /// <param name="file">Excelæ¨¡æ¿æä»¶</param> /// <returns>å¯¼å ¥çè®°å½æ°</returns> [HttpPost("WmsSubstituteGood/importExcel")] public async Task<int> ImportExcelAsync(IFormFile file) { int _HeadStartLine = 2;//第1è¡æ¯è¯´æ,第2è¡æ¯åå int _DataStartLine = 3;//第3è¡å¼å§æ¯æ°æ® DataTable importDataTable = ExcelUtil.ImportExcelToDataTable(file, _HeadStartLine, _DataStartLine); var addList =await CommonImport(importDataTable, _DataStartLine); lock (_lock) { _wmsSubstituteGoodRep.InsertAsync(addList); } await Task.CompletedTask; return addList.Count; } /// <summary> /// DataTable转æ¢å®ä½å¯¹è±¡å表 /// </summary> /// <param name="dataTable"></param> /// <param name="dataStartLine">模çååå¼å§è¡</param> /// <returns></returns> private async Task<List<WmsSubstituteGood>> CommonImport(DataTable dataTable, int dataStartLine) { var details = new List<WmsSubstituteGood>(); int index = dataStartLine;//模çååå¼å§è¡ foreach (System.Data.DataRow row in dataTable.Rows) { index++; //å¯¼å ¥æ¨¡çå®å¶å代ç ï¼æ¿æ¢æ¨¡ç使ç¨ï¼ var addItem = new WmsSubstituteGood() { CreatedTime = SysHelper.GetNowTime(), CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region å®ä¹åé var _SubstituteCode = "";//æ¿ä»£ç¼å· var _MaterialCode = "";//ç©æç¼å· var _MaterialName = "";//ç©æåç§° var _SubstituteMaterialCode = "";//æ¿ä»£åç©æç¼å· var _SubstituteMaterialName = "";//æ¿ä»£åç©æåç§° var _SubstituteIndex = "";//æ¿ä»£æ¬¡åº var _IsDisabled = "";//æ¯å¦ç¦ç¨ var _Id = "";//Idä¸»é® #endregion #region åå¼ _SubstituteCode = row["æ¿ä»£ç¼å·"]?.ToString() ; _MaterialCode = row["ç©æç¼å·"]?.ToString() ; _MaterialName = row["ç©æåç§°"]?.ToString() ; _SubstituteMaterialCode = row["æ¿ä»£åç©æç¼å·"]?.ToString() ; _SubstituteMaterialName = row["æ¿ä»£åç©æåç§°"]?.ToString() ; _SubstituteIndex = row["æ¿ä»£æ¬¡åº"]?.ToString() ; _IsDisabled = row["æ¯å¦ç¦ç¨"]?.ToString() ; _Id = row["Id主é®"]?.ToString() ; #endregion #region éªè¯ if (string.IsNullOrEmpty(_SubstituteCode)) { throw Oops.Oh($"第{index}è¡[æ¿ä»£ç¼å·]{_SubstituteCode}ä¸è½ä¸ºç©ºï¼"); } if(!string.IsNullOrEmpty(_SubstituteCode)) { addItem.SubstituteCode = (string)_SubstituteCode; } if (string.IsNullOrEmpty(_MaterialCode)) { throw Oops.Oh($"第{index}è¡[ç©æç¼å·]{_MaterialCode}ä¸è½ä¸ºç©ºï¼"); } if(!string.IsNullOrEmpty(_MaterialCode)) { addItem.MaterialCode = (string)_MaterialCode; } if (string.IsNullOrEmpty(_MaterialName)) { throw Oops.Oh($"第{index}è¡[ç©æåç§°]{_MaterialName}ä¸è½ä¸ºç©ºï¼"); } if(!string.IsNullOrEmpty(_MaterialName)) { addItem.MaterialName = (string)_MaterialName; } if (string.IsNullOrEmpty(_SubstituteMaterialCode)) { throw Oops.Oh($"第{index}è¡[æ¿ä»£åç©æç¼å·]{_SubstituteMaterialCode}ä¸è½ä¸ºç©ºï¼"); } if(!string.IsNullOrEmpty(_SubstituteMaterialCode)) { addItem.SubstituteMaterialCode = (string)_SubstituteMaterialCode; } if (string.IsNullOrEmpty(_SubstituteMaterialName)) { throw Oops.Oh($"第{index}è¡[æ¿ä»£åç©æåç§°]{_SubstituteMaterialName}ä¸è½ä¸ºç©ºï¼"); } if(!string.IsNullOrEmpty(_SubstituteMaterialName)) { addItem.SubstituteMaterialName = (string)_SubstituteMaterialName; } if (string.IsNullOrEmpty(_SubstituteIndex)) { throw Oops.Oh($"第{index}è¡[æ¿ä»£æ¬¡åº]{_SubstituteIndex}ä¸è½ä¸ºç©ºï¼"); } if(!string.IsNullOrEmpty(_SubstituteIndex)) { if (!int.TryParse(_SubstituteIndex, out int outSubstituteIndex)&&!string.IsNullOrEmpty(_SubstituteIndex)) { throw Oops.Oh($"第{index}è¡[æ¿ä»£æ¬¡åº]{_SubstituteIndex}å¼ä¸æ£ç¡®ï¼"); } if (outSubstituteIndex <= 0&&!string.IsNullOrEmpty(_SubstituteIndex)) { throw Oops.Oh($"第{index}è¡[æ¿ä»£æ¬¡åº]{_SubstituteIndex}å¼ä¸è½å°äºçäº0ï¼"); } else { addItem.SubstituteIndex = outSubstituteIndex; } } if (string.IsNullOrEmpty(_IsDisabled)) { throw Oops.Oh($"第{index}è¡[æ¯å¦ç¦ç¨]{_IsDisabled}ä¸è½ä¸ºç©ºï¼"); } if(!string.IsNullOrEmpty(_IsDisabled)) { if(!_IsDisabled.Equals("æ¯") && !_IsDisabled.Equals("å¦")) { throw Oops.Oh($"第{index}è¡[æ¯å¦ç¦ç¨]{_IsDisabled}å¼ä¸æ£ç¡®ï¼"); } else { bool outIsDisabled = _IsDisabled.Equals("æ¯") ? true : false; addItem.IsDisabled = outIsDisabled; } } if(!string.IsNullOrEmpty(_Id)) { if (!long.TryParse(_Id, out long outId)&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}è¡[Id主é®]{_Id}å¼ä¸æ£ç¡®ï¼"); } if (outId <= 0&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}è¡[Id主é®]{_Id}å¼ä¸è½å°äºçäº0ï¼"); } else { addItem.Id = outId; } } #endregion details.Add(addItem); } //éªé await CheckExisitForImport(details); return details; } /// <summary> /// æ ¹æ®çæ¬ä¸è½½æ¿ä»£å管ççExcelå¯¼å ¥æ¨¡æ¿ /// </summary> /// <param name="version">模æ¿çæ¬</param> /// <returns>ä¸è½½çæ¨¡æ¿æä»¶</returns> [HttpGet("WmsSubstituteGood/downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_å¯¼å ¥æ¨¡çè·¯å¾ + $"\\WmsSubstituteGood{TemplateConst.EXCEL_TEMPLATEFILE_å¯¼å ¥æ¨¡çåç§°åç¼}.xlsx"; var fileName = HttpUtility.UrlEncode($"å¯¼å ¥æ¨¡æ¿(æ¿ä»£å管ç).xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; } #endregion #region ç§ææ¹æ³ /// <summary> /// æ ¹æ®èå主é®éªè¯æ°æ®æ¯å¦å·²åå¨-æ°æ®åº /// </summary> /// <param name="input"></param> /// <param name="isEdit"></param> /// <returns></returns> private async Task CheckExisit( WmsSubstituteGood input,bool isEdit=false) { bool isExist = false; if (!isEdit)//æ°å¢ { //æ°æ®æ¯å¦åå¨éå¤ isExist = await _wmsSubstituteGoodRep.AnyAsync(u => u.SubstituteCode.Equals(input.SubstituteCode) ,false); } else//ç¼è¾ { //å½åç¼è¾æ°æ®ä»¥å¤æ¯å¦åå¨éå¤ isExist = await _wmsSubstituteGoodRep.AnyAsync(u => u.Id != input.Id &&u.SubstituteCode.Equals(input.SubstituteCode) ,false); } if (isExist) throw Oops.Oh(ErrorCode.E0001); } /// <summary> /// æ ¹æ®èå主é®éªè¯æ°æ®æ¯å¦å·²åå¨-å¯¼å ¥æ¶éªè¯ /// </summary> /// <param name="inputs"></param> /// <returns></returns> private async Task CheckExisitForImport(List<WmsSubstituteGood> inputs) { //æ ¹æ®èå主é®éªè¯è¡¨æ ¼ä¸ä¸æ¯å¦å·²åå¨ç¸åæ°æ® if (inputs?.Count <= 0) { throw Oops.Oh($"å¯¼å ¥æ°æ®ä¸è½ä¸ºç©º"); } //æ°æ®æ¯å¦éå¤ var existExcelItem = inputs.GroupBy(g => new { g.SubstituteCode }) .Where(g => g.Count() > 1) .Select(s => new { s.Key.SubstituteCode }).FirstOrDefault(); if (existExcelItem != null) { var wmsSubstituteGood = existExcelItem.Adapt<WmsSubstituteGood>(); var item= existExcelItem.Adapt<WmsSubstituteGood>(); throw Oops.Oh($"å¯¼å ¥çè¡¨æ ¼ä¸,æ¿ä»£ç¼å·[{item.SubstituteCode}]å·²åå¨"); } //æ ¹æ®èå主é®éªè¯æ°æ®åºä¸æ¯å¦å·²åå¨ç¸åæ°æ® var existDBItem = await _wmsSubstituteGoodRep.DetachedEntities.FirstOrDefaultAsync(w=> inputs.Select(s=>"" +s.SubstituteCode ) .Contains("" +w.SubstituteCode )); if (existDBItem != null) { var wmsSubstituteGood = existExcelItem.Adapt<WmsSubstituteGood>(); var item= existExcelItem.Adapt<WmsSubstituteGood>(); throw Oops.Oh($"ç³»ç»ä¸,æ¿ä»£ç¼å·[{item.SubstituteCode}]å·²åå¨"); } } #endregion } } iWare_RawMaterialWarehouse_Wms/Admin.NET.Web.Entry/wwwroot/ExcelTemplateFile/WmsSubstituteGoodImport.xlsxBinary files differ