diff --git a/ant-design-vue-jeecg/.env.test b/ant-design-vue-jeecg/.env.test index 8cbb4ff..e7ebd07 100644 --- a/ant-design-vue-jeecg/.env.test +++ b/ant-design-vue-jeecg/.env.test @@ -1,5 +1,5 @@ NODE_ENV=production -VUE_APP_ENV=test +VUE_APP_ENV=production outputDir=dist VUE_APP_API_BASE_URL=http://172.16.29.77:8081/wms VUE_APP_CAS_BASE_URL=http://localhost:8443/cas diff --git a/ant-design-vue-jeecg/src/assets/huaheng.png b/ant-design-vue-jeecg/src/assets/huaheng.png index 463550d..176e33f 100644 --- a/ant-design-vue-jeecg/src/assets/huaheng.png +++ b/ant-design-vue-jeecg/src/assets/huaheng.png diff --git a/ant-design-vue-jeecg/src/components/jeecg/JEditableTable.vue b/ant-design-vue-jeecg/src/components/jeecg/JEditableTable.vue index 3f4dd81..86b050c 100644 --- a/ant-design-vue-jeecg/src/components/jeecg/JEditableTable.vue +++ b/ant-design-vue-jeecg/src/components/jeecg/JEditableTable.vue @@ -3110,7 +3110,7 @@ export default { margin-bottom: 8px; .gap { - padding-left: 8px; + padding-left: 0px; } } diff --git a/ant-design-vue-jeecg/src/components/layouts/UserLayout.vue b/ant-design-vue-jeecg/src/components/layouts/UserLayout.vue index 83cd5d2..f73913c 100644 --- a/ant-design-vue-jeecg/src/components/layouts/UserLayout.vue +++ b/ant-design-vue-jeecg/src/components/layouts/UserLayout.vue @@ -59,9 +59,9 @@ export default { .container { width: 100%; min-height: 100%; - background: #f0f2f5 url(~@/assets/background.svg) no-repeat 50%; + background-color: 255, 255, 255; background-size: 100%; - padding: 110px 0 144px; + // padding: 110px 0 144px; position: relative; a { @@ -72,8 +72,9 @@ export default { text-align: center; .header { - height: 44px; - line-height: 44px; + height: 59px; + line-height: 59px; + background-color: #111; .badge { position: absolute; @@ -86,7 +87,9 @@ export default { } .logo { - height: 44px; + height: 59px; + line-height: 59px; + padding: 19px; vertical-align: top; border-style: none; } @@ -102,10 +105,11 @@ export default { } .desc { - font-size: 14px; - color: rgba(0, 0, 0, 0.45); - margin-top: 12px; - margin-bottom: 40px; + font-size: 24px; + color: #111; + margin-top: 170px; + margin-bottom: 70px; + font-weight: bolder; } } diff --git a/ant-design-vue-jeecg/src/components/page/GlobalHeader.vue b/ant-design-vue-jeecg/src/components/page/GlobalHeader.vue index 9980f65..c7e1905 100644 --- a/ant-design-vue-jeecg/src/components/page/GlobalHeader.vue +++ b/ant-design-vue-jeecg/src/components/page/GlobalHeader.vue @@ -150,9 +150,9 @@ export default { this.topMenuStyle.headerIndexRight = {} this.topMenuStyle.headerIndexLeft = {} } else { - let rightWidth = '400px' - this.topMenuStyle.topNavHeader = {'min-width': '165px'} - this.topMenuStyle.topSmenuStyle = {'width': 'calc(100% - 165px)'} + let rightWidth = '356px' + this.topMenuStyle.topNavHeader = {'min-width': '208px'} + this.topMenuStyle.topSmenuStyle = {'width': 'calc(100% - 208px)'} this.topMenuStyle.headerIndexRight = {'min-width': rightWidth, 'white-space': 'nowrap'} this.topMenuStyle.headerIndexLeft = {'width': `calc(100% - ${rightWidth})`} } @@ -180,7 +180,7 @@ export default { .top-nav-header-index { .header-index-wide { - margin-left: 10px; + margin-left: 0px; .ant-menu.ant-menu-horizontal { height: @height; @@ -201,7 +201,7 @@ export default { z-index: 2; color: white; height: @height; - background-color: @primary-color; + background-color: #111; transition: background 300ms; /* dark 样式 */ diff --git a/ant-design-vue-jeecg/src/components/page/GlobalLayout.vue b/ant-design-vue-jeecg/src/components/page/GlobalLayout.vue index de2bf08..a62a806 100644 --- a/ant-design-vue-jeecg/src/components/page/GlobalLayout.vue +++ b/ant-design-vue-jeecg/src/components/page/GlobalLayout.vue @@ -9,7 +9,7 @@ @close="() => this.collapsed = false" :closable="false" :visible="collapsed" - width="200px" + width="208px" > <side-menu mode="inline" @@ -41,7 +41,7 @@ @close="() => this.collapsed = false" :closable="false" :visible="collapsed" - width="200px" + width="208px" > <side-menu mode="inline" @@ -56,7 +56,7 @@ <a-layout :class="[layoutMode, `content-width-${contentWidth}`]" - :style="{ paddingLeft: fixSiderbar && isDesktop() ? `${sidebarOpened ? 200 : 80}px` : '0' }"> + :style="{ paddingLeft: fixSiderbar && isDesktop() ? `${sidebarOpened ? 208 : 80}px` : '0' }"> <!-- layout header --> <global-header :mode="layoutMode" @@ -259,12 +259,12 @@ body { } .trigger { - font-size: 22px; - line-height: 59px; - padding: 0 18px; - cursor: pointer; + font-size: 25px; + line-height: 20px; + padding: 17px 18px 17px 18px; + margin: 0px 0px 0px 0px; + vertical-align: top; transition: color 300ms, background 300ms; - &:hover { background: rgba(255, 255, 255, 0.3); } @@ -313,7 +313,7 @@ body { transition: width .2s; &.ant-header-side-opened { - width: calc(100% - 200px) + width: calc(100% - 208px) } &.ant-header-side-closed { @@ -354,10 +354,10 @@ body { } .avatar { - margin: 20px 10px 20px 0; + margin: 18px 0px 17px 0px; color: #1890ff; background: hsla(0, 0%, 100%, .85); - vertical-align: middle; + vertical-align: top; } .icon { @@ -403,8 +403,8 @@ body { .logo.top-nav-header { text-align: center; - width: 58px; - line-height: 58px; + width: 59px; + line-height: 59px; } } } @@ -455,14 +455,14 @@ body { .header-index-wide { width: 100%; margin: auto; - padding: 0 20px 0 0; + padding: 0 12px 0 0; display: flex; height: 59px; .ant-menu.ant-menu-horizontal { border: none; - height: 64px; - line-height: 64px; + height: 59px; + line-height: 59px; } .header-index-left { @@ -470,17 +470,19 @@ body { display: flex; .logo.top-nav-header { - width: 160px; - height: 58px; + width: 208px; + height: 59px; + padding: 0 10px; + text-align: center; position: relative; - line-height: 58px; + line-height: 54px; transition: all .3s; overflow: hidden; img { display: inline-block; vertical-align: middle; - height: 32px; + height: 20px; } h1 { @@ -595,11 +597,11 @@ body { height: 64px; position: relative; line-height: 64px; - padding-left: 24px; -webkit-transition: all .3s; transition: all .3s; background: #002140; overflow: hidden; + text-align: center; img, h1 { display: inline-block; @@ -607,7 +609,8 @@ body { } img { - height: 32px; + height: 20px; + vertical-align: middle; } h1 { @@ -644,7 +647,7 @@ body { padding: 4px 0; .ant-dropdown-menu-item { - width: 160px; + width: auto; } .ant-dropdown-menu-item > .anticon:first-child, diff --git a/ant-design-vue-jeecg/src/components/tools/Logo.vue b/ant-design-vue-jeecg/src/components/tools/Logo.vue index 9d98d0b..cb7ef60 100644 --- a/ant-design-vue-jeecg/src/components/tools/Logo.vue +++ b/ant-design-vue-jeecg/src/components/tools/Logo.vue @@ -60,7 +60,7 @@ export default { } &.light .logo { - background-color: @primary-color; + background-color: #111; } } </style> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/components/tools/UserMenu.vue b/ant-design-vue-jeecg/src/components/tools/UserMenu.vue index db58df0..2c8eb4a 100644 --- a/ant-design-vue-jeecg/src/components/tools/UserMenu.vue +++ b/ant-design-vue-jeecg/src/components/tools/UserMenu.vue @@ -36,8 +36,8 @@ <header-notice class="action"/> <a-dropdown> <span class="action action-full ant-dropdown-link user-dropdown-menu"> - <!-- <a-avatar class="avatar" size="small" :src="getAvatar()"/> --> - <span v-if="isDesktop()">欢迎您,{{ nickname() }}</span> + <a-avatar class="avatar" size="small" :src="getAvatar()"/> + <span v-if="isDesktop()" style="padding: 0px 0px 0px 10px;">欢迎您,{{ nickname() }}</span> </span> <a-menu slot="overlay" class="user-dropdown-menu-wrapper"> <!-- <a-menu-item key="0"> @@ -46,12 +46,12 @@ <span>个人中心</span> </router-link> </a-menu-item> --> - <a-menu-item key="1"> + <!-- <a-menu-item key="1"> <router-link :to="{ name: 'account-settings-base' }"> <a-icon type="setting"/> <span>账户设置</span> </router-link> - </a-menu-item> + </a-menu-item> --> <a-menu-item key="3" @click="systemSetting"> <a-icon type="tool"/> <span>系统设置</span> diff --git a/ant-design-vue-jeecg/src/defaultSettings.js b/ant-design-vue-jeecg/src/defaultSettings.js index 1135d33..3918af4 100644 --- a/ant-design-vue-jeecg/src/defaultSettings.js +++ b/ant-design-vue-jeecg/src/defaultSettings.js @@ -18,7 +18,7 @@ export default { navTheme: 'dark', // theme for nav menu layout: 'sidemenu', // nav menu position: sidemenu or topmenu contentWidth: 'Fixed', // layout of content: Fluid or Fixed, only works when layout is topmenu - fixedHeader: false, // sticky header + fixedHeader: true, // sticky header fixSiderbar: true, // sticky siderbar autoHideHeader: false, // auto hide header colorWeak: false, diff --git a/ant-design-vue-jeecg/src/views/system/RoleUserList.vue b/ant-design-vue-jeecg/src/views/system/RoleUserList.vue index fff9774..6d83886 100644 --- a/ant-design-vue-jeecg/src/views/system/RoleUserList.vue +++ b/ant-design-vue-jeecg/src/views/system/RoleUserList.vue @@ -543,6 +543,6 @@ export default { @import '~@assets/less/common.less'; /** Button按钮间距 */ .ant-btn { - margin-left: 8px + margin-left: 0px } </style> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/config/AddressList.vue b/ant-design-vue-jeecg/src/views/system/config/AddressList.vue index b9b327b..28e1b76 100644 --- a/ant-design-vue-jeecg/src/views/system/config/AddressList.vue +++ b/ant-design-vue-jeecg/src/views/system/config/AddressList.vue @@ -147,7 +147,6 @@ export default { align: 'center', dataIndex: 'param' }, - { title: '库区', align: 'center', diff --git a/ant-design-vue-jeecg/src/views/system/config/LocationTypeList.vue b/ant-design-vue-jeecg/src/views/system/config/LocationTypeList.vue index d64f65e..ca2c299 100644 --- a/ant-design-vue-jeecg/src/views/system/config/LocationTypeList.vue +++ b/ant-design-vue-jeecg/src/views/system/config/LocationTypeList.vue @@ -5,6 +5,14 @@ <a-form layout="inline" @keyup.enter.native="searchQuery"> <a-row :gutter="24"> <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="库区"> + <a-form-model-item prop="zoneOptions"> + <j-multi-select-tag v-model="queryParam.zoneCode" :options="zoneOptions" placeholder="请选择"> + </j-multi-select-tag> + </a-form-model-item> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="编码"> <a-input placeholder="请输入编码" v-model="queryParam.code"></a-input> </a-form-item> @@ -78,6 +86,12 @@ class="j-table-force-nowrap" @change="handleTableChange" > + <span slot="zoneCode" slot-scope="zoneCode"> + <a-tag :key="zoneCode" color="blue"> + {{ solutionZoneCode(zoneCode) }} + </a-tag> + </span> + <template slot="htmlSlot" slot-scope="text"> <div v-html="text"></div> </template> @@ -126,6 +140,7 @@ import '@/assets/less/TableExpand.less' import { mixinDevice } from '@/utils/mixin' import { JeecgListMixin } from '@/mixins/JeecgListMixin' import LocationTypeModal from './modules/LocationTypeModal' +import { getZoneList } from '@/api/api' export default { name: 'LocationTypeList', @@ -135,6 +150,8 @@ export default { }, data() { return { + zoneList: [], + zoneOptions: [], description: '库位类型管理页面', // 表头 columns: [ @@ -161,7 +178,9 @@ export default { { title: '库区', align: 'center', - dataIndex: 'zoneCode' + dataIndex: 'zoneCode', + key: 'zoneCode', + scopedSlots: { customRender: 'zoneCode' } }, { title: '长度', @@ -225,6 +244,19 @@ export default { }, created() { this.getSuperFieldList() + getZoneList().then(res => { + if (res.success) { + this.zoneList = res.result + //延迟半秒执行,避免组件未加载完,数据已经加载完 + setTimeout(() => { + //slice可以在数组的任何位置进行删除/添加操作 + this.zoneOptions.splice(0, 1) + for (let i = 0; i < res.result.length; i++) { + this.zoneOptions.push({ value: res.result[i].code, text: res.result[i].name }) + } + }, 500) + } + }) }, computed: { importExcelUrl: function() { @@ -233,6 +265,16 @@ export default { }, methods: { initDictConfig() {}, + solutionZoneCode(value) { + var actions = [] + Object.keys(this.zoneList).some(key => { + if (this.zoneList[key].code == '' + value) { + actions.push(this.zoneList[key].name) + return true + } + }) + return actions.join('') + }, getSuperFieldList() { let fieldList = [] fieldList.push({ type: 'string', value: 'code', text: '编码', dictCode: '' }) diff --git a/ant-design-vue-jeecg/src/views/system/config/modules/AddressForm.vue b/ant-design-vue-jeecg/src/views/system/config/modules/AddressForm.vue index ebc15f0..501c6b2 100644 --- a/ant-design-vue-jeecg/src/views/system/config/modules/AddressForm.vue +++ b/ant-design-vue-jeecg/src/views/system/config/modules/AddressForm.vue @@ -14,17 +14,13 @@ </a-form-model-item> </a-col> <a-col :span="24"> - <a-form-model-item label="库区" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zoneCode"> - <a-select - show-search - placeholder="请选择库区" - option-filter-prop="children" - v-model="model.zoneCode"> + <a-form-item label="库区" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zoneCode"> + <a-select show-search placeholder="请选择库区" option-filter-prop="children" v-model="model.zoneCode"> <a-select-option v-for="item in zoneList" :key="item.name" :value="item.code"> {{ item.name }} </a-select-option> </a-select> - </a-form-model-item> + </a-form-item> </a-col> <a-col :span="24"> <a-form-model-item label="接口地址" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="url"> @@ -38,10 +34,9 @@ </template> <script> - -import {httpAction, getAction} from '@/api/manage' -import {validateDuplicateValue} from '@/utils/util' -import {getZoneList} from '@/api/api' +import { httpAction, getAction } from '@/api/manage' +import { validateDuplicateValue } from '@/utils/util' +import { getZoneList } from '@/api/api' export default { name: 'AddressForm', @@ -56,79 +51,79 @@ export default { }, data() { return { - zoneList: [], model: {}, + zoneList: [], labelCol: { - xs: {span: 24}, - sm: {span: 5}, + xs: { span: 24 }, + sm: { span: 5 } }, wrapperCol: { - xs: {span: 24}, - sm: {span: 16}, + xs: { span: 24 }, + sm: { span: 16 } }, confirmLoading: false, validatorRules: {}, url: { - add: "/config/address/add", - edit: "/config/address/edit", - queryById: "/config/address/queryById" + add: '/config/address/add', + edit: '/config/address/edit', + queryById: '/config/address/queryById' } } }, computed: { formDisabled() { return this.disabled - }, + } }, created() { //备份model原始值 - this.modelDefault = JSON.parse(JSON.stringify(this.model)); - this.loadFrom(); + this.modelDefault = JSON.parse(JSON.stringify(this.model)) + this.loadFrom() }, methods: { - add() { - this.edit(this.modelDefault); - }, - edit(record) { - this.model = Object.assign({}, record); - this.visible = true; - }, loadFrom() { - getZoneList().then((res) => { + getZoneList().then(res => { if (res.success) { this.zoneList = res.result } - }); + }) + }, + add() { + this.edit(this.modelDefault) + }, + edit(record) { + this.model = Object.assign({}, record) + this.visible = true }, submitForm() { - const that = this; + const that = this // 触发表单验证 this.$refs.form.validate(valid => { if (valid) { - that.confirmLoading = true; - let httpurl = ''; - let method = ''; + that.confirmLoading = true + let httpurl = '' + let method = '' if (!this.model.id) { - httpurl += this.url.add; - method = 'post'; + httpurl += this.url.add + method = 'post' } else { - httpurl += this.url.edit; - method = 'put'; + httpurl += this.url.edit + method = 'put' } - httpAction(httpurl, this.model, method).then((res) => { + httpAction(httpurl, this.model, method).then(res => { if (res.success) { - that.$message.success(res.message); - that.$emit('ok'); + that.$message.success(res.message) + that.$emit('ok') } else { - that.$message.warning(res.message); + that.$message.warning(res.message) } - }).finally(() => { - that.confirmLoading = false; + }) + .finally(() => { + that.confirmLoading = false }) } - }) - }, + } } } </script> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/inventory/InventoryDetailList.vue b/ant-design-vue-jeecg/src/views/system/inventory/InventoryDetailList.vue index ac5bef9..2cc727d 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/InventoryDetailList.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/InventoryDetailList.vue @@ -115,7 +115,9 @@ export default { { title: '库存详情ID', align: 'center', - dataIndex: 'id' + dataIndex: 'id', + fixed: "left", + width: 100, }, { title: '货主', @@ -229,14 +231,14 @@ export default { align: 'center', dataIndex: 'updateTime' }, - { - title: '操作', - dataIndex: 'action', - align: 'center', - fixed: 'right', - width: 147, - scopedSlots: {customRender: 'action'} - } + // { + // title: '操作', + // dataIndex: 'action', + // align: 'center', + // fixed: 'right', + // width: 147, + // scopedSlots: {customRender: 'action'} + // } ], url: { list: '/inventory/inventoryHeader/listInventoryDetailByMainId', diff --git a/ant-design-vue-jeecg/src/views/system/inventory/InventoryHeaderList.vue b/ant-design-vue-jeecg/src/views/system/inventory/InventoryHeaderList.vue index 3788427..0318551 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/InventoryHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/InventoryHeaderList.vue @@ -175,6 +175,8 @@ export default { { title: '库存ID', align: "center", + fixed: "left", + width: 100, dataIndex: 'id' }, { @@ -230,14 +232,14 @@ export default { align: "center", dataIndex: 'updateTime' }, - { - title: '操作', - dataIndex: 'action', - align: "center", - fixed: "right", - width: 147, - scopedSlots: {customRender: 'action'}, - } + // { + // title: '操作', + // dataIndex: 'action', + // align: "center", + // fixed: "right", + // width: 147, + // scopedSlots: {customRender: 'action'}, + // } ], url: { list: "/inventory/inventoryHeader/list", diff --git a/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue b/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue index a4d1bd2..b2773b1 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue @@ -15,7 +15,7 @@ </a-form-model-item> </a-form-item> </a-col> - <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <!-- <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="货主"> <a-select show-search @@ -28,6 +28,16 @@ </a-select-option> </a-select> </a-form-item> + </a-col> --> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="入库单编码"> + <a-input placeholder="请输入入库单编码" v-model="queryParam.receiptCode"></a-input> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="出库单编码"> + <a-input placeholder="请输入出库单编码" v-model="queryParam.shipmentCode"></a-input> + </a-form-item> </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="库位编码"> @@ -49,18 +59,18 @@ <j-dict-select-tag placeholder="请选择库存状态" v-model="queryParam.inventoryStatus" dictCode="inventory_status"/> </a-form-item> </a-col> - <a-col :xl="6" :lg="7" :md="8" :sm="24"> - <a-form-item label="物料编码"> - <a-input placeholder="请输入物料编码" v-model="queryParam.materialCode"></a-input> - </a-form-item> - </a-col> - <a-col :xl="6" :lg="7" :md="8" :sm="24"> - <a-form-item label="物料名称"> - <a-input placeholder="请输入物料名称" v-model="queryParam.materialName"></a-input> - </a-form-item> - </a-col> <template v-if="toggleSearchStatus"> <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="物料编码"> + <a-input placeholder="请输入物料编码" v-model="queryParam.materialCode"></a-input> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="物料名称"> + <a-input placeholder="请输入物料名称" v-model="queryParam.materialName"></a-input> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="物料规格"> <a-input placeholder="请输入物料规格" v-model="queryParam.materialSpec"></a-input> </a-form-item> @@ -107,36 +117,14 @@ <!-- 操作按钮区域 --> <div class="table-operator"> - <a-button @click="handleAdd" v-has="'inventoryTransaction:add'" type="primary" icon="plus">新增</a-button> - <a-button v-has="'inventoryTransaction:export'" type="primary" icon="download" - @click="handleExportXls('库存交易记录')">导出 - </a-button> - <a-upload v-has="'inventoryTransaction:import'" name="file" :showUploadList="false" :multiple="false" - :headers="tokenHeader" :action="importExcelUrl" - @change="handleImportExcel"> + <a-button v-has="'inventoryTransaction:export'" type="primary" icon="download" @click="handleExportXls('库存交易记录')">导出</a-button> + <a-upload v-has="'inventoryTransaction:import'" name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel"> <a-button type="primary" icon="import">导入</a-button> </a-upload> - <a-dropdown v-if="selectedRowKeys.length > 0"> - <a-menu slot="overlay" v-has="'inventoryTransaction:deleteBatch'"> - <a-menu-item key="1" @click="batchDel"> - <a-icon type="delete"/> - 删除 - </a-menu-item> - </a-menu> - <a-button style="margin-left: 8px"> 批量操作 - <a-icon type="down"/> - </a-button> - </a-dropdown> </div> <!-- table区域-begin --> <div> - <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> - <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a - style="font-weight: 600">{{ selectedRowKeys.length }}</a> 项 - <a style="margin-left: 24px" @click="onClearSelected">清空</a> - </div> - <a-table ref="table" size="middle" @@ -147,7 +135,6 @@ :dataSource="dataSource" :pagination="ipagination" :loading="loading" - :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" class="j-table-force-nowrap" @change="handleTableChange"> @@ -168,8 +155,6 @@ {{ solutionZoneCode(zoneCode) }} </a-tag> </span> - </a-table> - <template slot="htmlSlot" slot-scope="text"> <div v-html="text"></div> </template> @@ -190,7 +175,6 @@ 下载 </a-button> </template> - <span slot="action" slot-scope="text, record"> <a v-has="'inventoryTransaction:edit'" @click="handleEdit(record)">编辑<a-divider type="vertical"/></a> <a-dropdown> @@ -207,7 +191,6 @@ </a-menu> </a-dropdown> </span> - </a-table> </div> @@ -241,7 +224,9 @@ export default { { title: '库存交易ID', align: "center", - dataIndex: 'id' + dataIndex: 'id', + fixed: 'left', + width: 100, }, { title: '库区', @@ -258,6 +243,16 @@ export default { // scopedSlots: {customRender: 'companyCode'} // }, { + title: '入库单编码', + align: "center", + dataIndex: 'receiptCode' + }, + { + title: '出库单编码', + align: "center", + dataIndex: 'shipmentCode' + }, + { title: '容器编码', align: "center", dataIndex: 'containerCode' @@ -319,16 +314,6 @@ export default { dataIndex: 'batch' }, { - title: '入库单编码', - align: "center", - dataIndex: 'receiptCode' - }, - { - title: '出库单编码', - align: "center", - dataIndex: 'shipmentCode' - }, - { title: '创建人', align: "center", dataIndex: 'createBy' @@ -348,14 +333,14 @@ export default { align: "center", dataIndex: 'updateTime' }, - { - title: '操作', - dataIndex: 'action', - align: "center", - fixed: "right", - width: 147, - scopedSlots: {customRender: 'action'} - } + // { + // title: '操作', + // dataIndex: 'action', + // align: "center", + // fixed: "right", + // width: 147, + // scopedSlots: {customRender: 'action'} + // } ], url: { list: "/inventory/inventoryTransaction/list", diff --git a/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue b/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue index 52f5b98..58bdfc8 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/SimpleInventoryDetailList.vue @@ -161,7 +161,6 @@ :dataSource="dataSource" :pagination="ipagination" :loading="loading" - :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }" class="j-table-force-nowrap" @change="handleTableChange" > @@ -198,9 +197,7 @@ </template> <template slot="fileSlot" slot-scope="text"> <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> - <a-button v-else :ghost="true" type="primary" icon="download" size="small" @click="downloadFile(text)"> - 下载 - </a-button> + <a-button v-else :ghost="true" type="primary" icon="download" size="small" @click="downloadFile(text)">下载</a-button> </template> <span slot="action" slot-scope="text, record"> <a v-has="'inventoryDetail:edit'" @click="handleEdit(record)">编辑<a-divider type="vertical"/></a> @@ -238,14 +235,11 @@ export default { // 表头 columns: [ { - title: '#', - dataIndex: '', - key: 'rowIndex', - width: 60, + title: '库存详情ID', align: 'center', - customRender: function (t, r, index) { - return parseInt(index) + 1 - } + dataIndex: 'id', + fixed: "left", + width: 100, }, { title: '货主', @@ -355,14 +349,14 @@ export default { align: 'center', dataIndex: 'updateTime' }, - { - title: '操作', - dataIndex: 'action', - align: 'center', - fixed: 'right', - width: 147, - scopedSlots: {customRender: 'action'} - } + // { + // title: '操作', + // dataIndex: 'action', + // align: 'center', + // fixed: 'right', + // width: 147, + // scopedSlots: {customRender: 'action'} + // } ], url: { list: '/inventory/inventoryDetail/list', diff --git a/ant-design-vue-jeecg/src/views/system/inventory/subTables/InventoryDetailSubTable.vue b/ant-design-vue-jeecg/src/views/system/inventory/subTables/InventoryDetailSubTable.vue index c41df9f..3d3bb69 100644 --- a/ant-design-vue-jeecg/src/views/system/inventory/subTables/InventoryDetailSubTable.vue +++ b/ant-design-vue-jeecg/src/views/system/inventory/subTables/InventoryDetailSubTable.vue @@ -94,6 +94,7 @@ export default { align: 'center', dataIndex: 'id', fixed: 'left', + width: 100, }, { title: '货主', diff --git a/ant-design-vue-jeecg/src/views/system/monitor/ApiLogList.vue b/ant-design-vue-jeecg/src/views/system/monitor/ApiLogList.vue index e48044e..3f065c0 100644 --- a/ant-design-vue-jeecg/src/views/system/monitor/ApiLogList.vue +++ b/ant-design-vue-jeecg/src/views/system/monitor/ApiLogList.vue @@ -103,24 +103,24 @@ <template :slot="expandedRowRender" slot-scope="record"> <div style="margin: 0"> <div> - <a-badge status="default" style="vertical-align: revert;" /> + <a-badge status="default" style="vertical-align: text-bottom;" /> <a-button @click="copyToClipboard(record.requestHeader)" type="link" icon="copy" style="vertical-align: revert;"></a-button> - <span style="vertical-align: left;word-break:break-all;white-space:pre-wrap;overflow:hidden;color:#b3b3b3;">请求头:{{ record.requestHeader }}</span> + <span style="vertical-align: text-bottom; word-break:break-all; white-space:pre-wrap; overflow:hidden; color:#b3b3b3;">请求头:{{ record.requestHeader }}</span> </div> <div> - <a-badge status="success" style="vertical-align: middle;" /> - <a-button @click="copyToClipboard(record.requestBody)" type="link" icon="copy" style="vertical-align: middle;"></a-button> - <span style="vertical-align: middle; word-break: break-all; white-space: pre-wrap; overflow: hidden; color: saddlebrown;">请求内容:{{ record.requestBody }}</span> + <a-badge status="success" style="vertical-align: text-bottom;" /> + <a-button @click="copyToClipboard(record.requestBody)" type="link" icon="copy" style="vertical-align: revert;"></a-button> + <span style="vertical-align: text-bottom; word-break:break-all; white-space:pre-wrap; overflow:hidden; color: saddlebrown;">请求内容:{{ record.requestBody }}</span> </div> <div> - <a-badge status="processing" style="vertical-align: revert;" /> + <a-badge status="processing" style="vertical-align: text-bottom;" /> <a-button @click="copyToClipboard(record.responseBody)" type="link" icon="copy" style="vertical-align: revert;"></a-button> - <span style="vertical-align: text-bottom;word-break:break-all;white-space:pre-wrap;overflow:hidden;color:#0066CC;">响应内容:{{ record.responseBody }}</span> + <span style="vertical-align: text-bottom; word-break:break-all; white-space:pre-wrap; overflow:hidden; color:#0066CC;">响应内容:{{ record.responseBody }}</span> </div> <div v-if="record.exception" > - <a-badge status="error" style="vertical-align: revert;" /> + <a-badge status="error" style="vertical-align: text-bottom;" /> <a-button @click="copyToClipboard(record.exception)" type="link" icon="copy" style="vertical-align: revert;"></a-button> - <span style="vertical-align: text-bottom;word-break:break-all;white-space:pre-wrap;overflow:hidden;color:red">异常堆栈信息:{{ record.exception }}</span> + <span style="vertical-align: text-bottom; word-break:break-all; white-space:pre-wrap; overflow:hidden; color:red">异常堆栈信息:{{ record.exception }}</span> </div> </div> </template> diff --git a/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue b/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue index ef7f163..7a14894 100644 --- a/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue @@ -117,8 +117,8 @@ </a-button> </template> <span slot="action" slot-scope="text, record"> - <a v-if="record.status == 0 && record.taskType == 200" @click="selectFillPort(record)" v-has="'receiptContainerHeader:createTask'"><a-button type="primary">生成任务</a-button> <a-divider type="vertical"/></a> - <a v-else-if="record.status == 0" @click="selectContainerStatus(record)" v-has="'receiptContainerHeader:createTask'"><a-button type="primary">生成任务</a-button> <a-divider type="vertical"/></a> + <a v-if="record.status == 0 && record.taskType == 200" @click="selectFillPort(record)" v-has="'receiptContainerHeader:createTask'"><a-button type="primary">生成任务</a-button><a-divider type="vertical"/></a> + <a v-else-if="record.status == 0" @click="selectContainerStatus(record)" v-has="'receiptContainerHeader:createTask'"><a-button type="primary">生成任务</a-button><a-divider type="vertical"/></a> <!-- <a v-if="record.status == 0 && record.taskType == 200" @click="selectPort(record)" v-has="'receiptContainerHeader:createTask'">生成任务<a-divider type="vertical"/></a>--> <!-- <a v-else-if="record.status == 0" @click="createTask(record)" v-has="'receiptContainerHeader:createTask'">生成任务<a-divider type="vertical"/></a>--> <a-popconfirm v-if="record.status == 0" v-has="'receiptContainerHeader:delete'" title="确定取消配盘吗?" @confirm="() => handleDelete(record.id)"> diff --git a/ant-design-vue-jeecg/src/views/system/shipment/ShipmentContainerHeaderList.vue b/ant-design-vue-jeecg/src/views/system/shipment/ShipmentContainerHeaderList.vue index ef53ab0..ad5e740 100644 --- a/ant-design-vue-jeecg/src/views/system/shipment/ShipmentContainerHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/shipment/ShipmentContainerHeaderList.vue @@ -126,11 +126,11 @@ </template> <span slot="action" slot-scope="text, record"> - <a v-if="record.status == 0" @click="selectPort(record)"><a-button type="primary">生成任务</a-button> </a> + <a v-if="record.status == 0" @click="selectPort(record)"><a-button type="primary">生成任务</a-button><a-divider type="vertical"/></a> <a-popconfirm v-if="record.status == 0" v-has="'shipmentContainerHeader:delete'" title="确定取消配盘吗?" @confirm="() => handleDelete(record.id)"> - <a><a-divider type="vertical"/><a-button type="danger">取消配盘</a-button> </a> + <a><a-button type="danger">取消配盘</a-button><a-divider type="vertical"/></a> </a-popconfirm> - <a v-has="'receiptContainerHeader:edit'" @click="handleEdit(record)"><a-divider type="vertical"/><a-button type="default">编辑</a-button></a> + <a v-has="'receiptContainerHeader:edit'" @click="handleEdit(record)"><a-button type="default">编辑</a-button></a> </span> </a-table> </div> diff --git a/ant-design-vue-jeecg/src/views/system/shipment/ShipmentDetailList.vue b/ant-design-vue-jeecg/src/views/system/shipment/ShipmentDetailList.vue index 237e73d..686de19 100644 --- a/ant-design-vue-jeecg/src/views/system/shipment/ShipmentDetailList.vue +++ b/ant-design-vue-jeecg/src/views/system/shipment/ShipmentDetailList.vue @@ -78,7 +78,6 @@ <span slot="action" slot-scope="text, record"> <a @click="combine(record)"><a-button type="primary">配盘</a-button></a> <a-divider type="vertical"/> - <a-dropdown> <a class="ant-dropdown-link">更多 <a-icon type="down"/></a> <a-menu slot="overlay"> diff --git a/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue b/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue index 8610188..0511040 100644 --- a/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue @@ -46,7 +46,7 @@ </a-form-item> </a-col> <template v-if="toggleSearchStatus"> - <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="起始出入口"> <a-input placeholder="请输入起始出入口" v-model="queryParam.fromPortCode"></a-input> </a-form-item> diff --git a/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue b/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue index acd00c7..aa70e99 100644 --- a/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue +++ b/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue @@ -78,8 +78,7 @@ <adjustment-doc-modal ref="adjustmentModal" @ok="modalFormOk" :id="record.id" :taskHeaderId="record.taskHeaderId"/> <a v-if="record.taskType==700" @click="createMany(record)">实盘登记</a> <a-divider type="vertical" v-if="record.taskType==700" /> - <a v-has="'taskDetail:edit'" @click="handleEdit(record)">编辑</a> - <a-divider type="vertical"/> + <a v-has="'taskDetail:edit'" @click="handleEdit(record)">编辑<a-divider type="vertical" /></a> <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> <a v-has="'taskDetail:delete'">删除</a> </a-popconfirm> diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java index 6323d0d..0029912 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java @@ -5,15 +5,9 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import cn.hutool.crypto.SecureUtil; -import cn.monitor4all.logRecord.annotation.OperationLog; - import org.apache.commons.lang.StringUtils; import org.jeecg.common.api.vo.Result; -import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; -import org.jeecg.utils.HuahengJwtUtil; -import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.RedisUtil; import org.jeecg.modules.cas.util.CASServiceUtil; import org.jeecg.modules.cas.util.XmlUtils; @@ -21,7 +15,7 @@ import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.service.ISysDepartService; import org.jeecg.modules.system.service.ISysUserService; -import org.springframework.beans.BeanUtils; +import org.jeecg.utils.HuahengJwtUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; @@ -45,11 +39,21 @@ import lombok.extern.slf4j.Slf4j; @RestController @RequestMapping("/sys/cas/client") public class CasClientController { + + /** Token失效时间 */ + private Long TOKEN_EXPIRE_TIME; + + @Value("${system.token.expireTime}") + public void setExpireTime(String expireTime) { + TOKEN_EXPIRE_TIME = Long.parseLong(expireTime); + } @Autowired private ISysUserService sysUserService; + @Autowired private ISysDepartService sysDepartService; + @Autowired private RedisUtil redisUtil; @@ -83,7 +87,7 @@ public class CasClientController { String token = HuahengJwtUtil.sign(sysUser.getUsername(), sysUser.getPassword()); // 设置超时时间 redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, HuahengJwtUtil.EXPIRE_TIME / 1000); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, TOKEN_EXPIRE_TIME / 1000); // 获取用户部门信息 JSONObject obj = new JSONObject(); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java index 39ef544..ad2977e 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java @@ -50,6 +50,7 @@ import org.jeecg.utils.config.ApplicationConfig; import org.jeecg.utils.support.SystemRSA256Key; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; @@ -89,6 +90,15 @@ import lombok.extern.slf4j.Slf4j; @Api(tags = "用户登录") @Slf4j public class LoginController { + + /** Token失效时间 */ + private Long TOKEN_EXPIRE_TIME; + + @Value("${system.token.expireTime}") + public void setExpireTime(String expireTime) { + TOKEN_EXPIRE_TIME = Long.parseLong(expireTime); + } + @Autowired private ISysUserService sysUserService; @@ -115,7 +125,7 @@ public class LoginController { @Autowired private HuahengRedisUtil huahengRedisUtil; - + @Autowired private ApplicationConfig applicationConfig; @@ -226,7 +236,7 @@ public class LoginController { private Result<JSONObject> checkSystemActivationCode() throws IOException { Result<JSONObject> result = new Result<JSONObject>(); // 是否需要校验激活码 - if(applicationConfig.getCheckSystemActivationCode() != null && !applicationConfig.getCheckSystemActivationCode()) { + if (applicationConfig.getCheckSystemActivationCode() != null && !applicationConfig.getCheckSystemActivationCode()) { return result; } FileInputStream inputStream = null; @@ -312,7 +322,7 @@ public class LoginController { } return result; } - + /** * 退出登录 * @param request @@ -615,7 +625,7 @@ public class LoginController { String token = HuahengJwtUtil.sign(username, syspassword, warehouseCode, roles); // 设置token缓存有效时间 redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, HuahengJwtUtil.EXPIRE_TIME / 1000); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, TOKEN_EXPIRE_TIME / 1000); obj.put("token", token); obj.put("userInfo", sysUser); obj.put("sysAllDictItems", sysDictService.queryAllDictItems()); @@ -721,7 +731,7 @@ public class LoginController { String token = JwtUtil.sign(username, syspassword); // 设置超时时间 redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, HuahengJwtUtil.EXPIRE_TIME / 1000); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, TOKEN_EXPIRE_TIME / 1000); // token 信息 obj.put("token", token); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java index f223036..ff175d6 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java @@ -1,17 +1,14 @@ package org.jeecg.modules.system.controller; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.xkcoding.justauth.AuthRequestFactory; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthCallback; -import me.zhyd.oauth.model.AuthResponse; -import me.zhyd.oauth.request.AuthRequest; -import me.zhyd.oauth.utils.AuthStateUtils; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.List; + +import javax.servlet.http.HttpServletResponse; + import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; -import org.jeecg.utils.HuahengJwtUtil; import org.jeecg.common.util.PasswordUtil; import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.RestUtil; @@ -26,16 +23,30 @@ import org.jeecg.modules.system.service.ISysThirdAccountService; import org.jeecg.modules.system.service.ISysUserService; import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl; import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl; +import org.jeecg.utils.HuahengJwtUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.List; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.xkcoding.justauth.AuthRequestFactory; + +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.utils.AuthStateUtils; /** * @Author scott @@ -45,22 +56,36 @@ import java.util.List; @RequestMapping("/sys/thirdLogin") @Slf4j public class ThirdLoginController { + + /** Token失效时间 */ + private Long TOKEN_EXPIRE_TIME; + + @Value("${system.token.expireTime}") + public void setExpireTime(String expireTime) { + TOKEN_EXPIRE_TIME = Long.parseLong(expireTime); + } + @Autowired private ISysUserService sysUserService; + @Autowired private ISysThirdAccountService sysThirdAccountService; @Autowired private BaseCommonService baseCommonService; + @Autowired private RedisUtil redisUtil; + @Autowired private AuthRequestFactory factory; @Autowired ThirdAppConfig thirdAppConfig; + @Autowired private ThirdAppWechatEnterpriseServiceImpl thirdAppWechatEnterpriseService; + @Autowired private ThirdAppDingtalkServiceImpl thirdAppDingtalkService; @@ -198,7 +223,7 @@ public class ThirdLoginController { String token = HuahengJwtUtil.sign(user.getUsername(), user.getPassword()); redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); // 设置超时时间 - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, HuahengJwtUtil.EXPIRE_TIME / 1000); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, TOKEN_EXPIRE_TIME / 1000); return token; } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/impl/MesServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/impl/MesServiceImpl.java index ff4f158..7c394a4 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/impl/MesServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mes/servuce/impl/MesServiceImpl.java @@ -150,7 +150,11 @@ public class MesServiceImpl implements IMesService { if (!success) { throw new JeecgBootException("MES下发入库信息,更新入库组盘头失败"); } - return huahengMultiHandlerService.createReceiptTask(receiptContainerHeader, warehouseCode); + result = receiptContainerHeaderService.createReceiptTask(receiptContainerHeader, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } + return result; } @Override diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java index b961b56..b591eec 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java @@ -162,7 +162,11 @@ public class WmsServiceImpl implements WmsService { if (!success) { throw new JeecgBootException("WMS下发入库信息,更新入库组盘头失败"); } - return huahengMultiHandlerService.createReceiptTask(receiptContainerHeader, warehouseCode); + result = receiptContainerHeaderService.createReceiptTask(receiptContainerHeader, warehouseCode); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } + return result; } @Override diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/IHuahengMultiHandlerService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/IHuahengMultiHandlerService.java index 0ff4ef3..4c57907 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/IHuahengMultiHandlerService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/IHuahengMultiHandlerService.java @@ -18,7 +18,7 @@ public interface IHuahengMultiHandlerService { Result sendTaskToWcs(TaskHeader taskHeader); - Result<TaskHeader> createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode); + Result createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode); Result combination(CombinationModel combinationModel); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/impl/HuahengMultiHandlerServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/impl/HuahengMultiHandlerServiceImpl.java index 1f54a49..c7ed5f5 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/impl/HuahengMultiHandlerServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/service/impl/HuahengMultiHandlerServiceImpl.java @@ -71,13 +71,11 @@ public class HuahengMultiHandlerServiceImpl extends HuahengBaseController implem @Override @Transactional(rollbackFor = Exception.class) - public Result<TaskHeader> createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode) { - String lockKey = warehouseCode; - Result result = handleMultiProcess("createReceiptTask", lockKey, new MultiProcessListener() { + public Result createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode) { + Result result = handleMultiProcess("createReceiptTask", warehouseCode, new MultiProcessListener() { @Override public Result<?> doProcess() { - Result result = receiptContainerHeaderService.createReceiptTask(receiptContainerHeader, warehouseCode); - return result; + return receiptContainerHeaderService.createReceiptTask(receiptContainerHeader, warehouseCode); } }); return result; @@ -89,8 +87,7 @@ public class HuahengMultiHandlerServiceImpl extends HuahengBaseController implem Result result = handleMultiProcess("combination", new MultiProcessListener() { @Override public Result<?> doProcess() { - Result result = shipmentCombinationService.combination(combinationModel); - return result; + return shipmentCombinationService.combination(combinationModel); } }); return result; diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java index 5bb4d0b..1ae2079 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java @@ -57,26 +57,37 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai @Autowired private ReceiptContainerHeaderMapper receiptContainerHeaderMapper; + @Autowired private ReceiptContainerDetailMapper receiptContainerDetailMapper; + @Resource private IContainerService containerService; + @Resource private IReceiptContainerDetailService receiptContainerDetailService; + @Resource private ILocationService locationService; + @Resource private IReceiptContainerHeaderService receiptContainerHeaderService; + @Resource private ITaskHeaderService taskHeaderService; + @Resource private ITaskDetailService taskDetailService; + @Resource private IReceiptDetailService receiptDetailService; + @Resource private IReceiptHeaderService receiptHeaderService; + @Resource private IInventoryHeaderService inventoryHeaderService; + @Resource private IParameterConfigurationService parameterConfigurationService; @@ -106,7 +117,7 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai } @Override - @Transactional(rollbackFor = JeecgBootException.class, propagation = Propagation.REQUIRES_NEW) + @Transactional @OperationLog(bizId = "''", bizType = "'入库单追踪'", tag = "'入库任务生成'", extra = "#extraJsonString1", msg = "'任务ID:' + #taskHeader.getId()", condition = "#receiptContainerDetailList.size() > 0", recordReturnValue = true) @OperationLog(bizId = "''", bizType = "'任务追踪'", tag = "'入库任务生成'", extra = "#extraJsonString2", @@ -115,7 +126,7 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai public Result<TaskHeader> createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode) { log.info("开始创建入库任务"); if (!receiptContainerHeader.getWarehouseCode().equals(warehouseCode)) { - return Result.error("创建入库任务, id:" + receiptContainerHeader.getId() + "的入库组盘不能在" + warehouseCode + "仓库操作"); + throw new JeecgBootException("创建入库任务, id:" + receiptContainerHeader.getId() + "的入库组盘不能在" + warehouseCode + "仓库操作"); } String containerCode = receiptContainerHeader.getContainerCode(); String fromLocationCode = receiptContainerHeader.getFromLocationCode(); @@ -125,11 +136,11 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai List<ReceiptContainerDetail> receiptContainerDetailList = receiptContainerDetailService.getReceiptContainerDetailListByHeaderId(receiptContainerHeader.getId()); if (receiptContainerDetailList.size() == 0) { - return Result.error("创建入库任务, id:" + receiptContainerHeader.getId() + "的入库组盘,没有组盘明细,请先组盘!"); + throw new JeecgBootException("创建入库任务, id:" + receiptContainerHeader.getId() + "的入库组盘,没有组盘明细,请先组盘!"); } int receiptContainerStatus = receiptContainerHeader.getStatus(); if (receiptContainerStatus != QuantityConstant.RECEIPT_CONTAINER_BUILD) { - return Result.error("创建入库任务, 入库组盘状态不是创建状态"); + throw new JeecgBootException("创建入库任务, 入库组盘状态不是创建状态"); } String containerFillStatus = QuantityConstant.STATUS_CONTAINER_FILL_SOME; if (!StringUtils.isEmpty(receiptContainerHeader.getContainerFillStatus())) { @@ -411,30 +422,36 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai } @Override + @Transactional public Result cancelReceiving(List<Integer> ids) { Result result = null; for (Integer id : ids) { - result = cancelReceiving(id); + result = receiptContainerHeaderService.cancelReceiving(id); + if (!result.isSuccess()) { + throw new JeecgBootException(result.getMessage()); + } } return result; } @Override + @Transactional public boolean updateToPortById(String toPort, int id) { ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader(); receiptContainerHeader.setToPort(toPort); receiptContainerHeader.setId(id); - boolean success = updateById(receiptContainerHeader); + boolean success = receiptContainerHeaderService.updateById(receiptContainerHeader); return success; } @Override + @Transactional public boolean updateToPortAndStatus(String toPort, int status, int id) { ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader(); receiptContainerHeader.setToPort(toPort); receiptContainerHeader.setStatus(status); receiptContainerHeader.setId(id); - boolean success = updateById(receiptContainerHeader); + boolean success = receiptContainerHeaderService.updateById(receiptContainerHeader); return success; } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java index 7902225..4f83284 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java @@ -181,15 +181,18 @@ public class ReceiptHeaderServiceImpl extends ServiceImpl<ReceiptHeaderMapper, R } } } - receiptHeader = new ReceiptHeader(); - receiptHeader.setId(id); - receiptHeader.setFirstStatus(maxStatus); - receiptHeader.setLastStatus(minStatus); - if (!receiptHeaderService.updateById(receiptHeader)) { + ReceiptHeader updateReceiptHeader = new ReceiptHeader(); + updateReceiptHeader.setId(id); + updateReceiptHeader.setCode(receiptHeader.getCode()); + updateReceiptHeader.setReferCode(receiptHeader.getReferCode()); + updateReceiptHeader.setWarehouseCode(receiptHeader.getWarehouseCode()); + updateReceiptHeader.setFirstStatus(maxStatus); + updateReceiptHeader.setLastStatus(minStatus); + if (!receiptHeaderService.updateById(updateReceiptHeader)) { throw new JeecgBootException("更新入库单:" + id + " 状态失败"); } LogRecordContext.putVariable("minStatus", minStatus); - LogRecordContext.putVariable("receiptHeader", receiptHeader); + LogRecordContext.putVariable("receiptHeader", updateReceiptHeader); return true; } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/controller/ReceiveController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/controller/ReceiveController.java index aa203f2..36b3b46 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/controller/ReceiveController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/controller/ReceiveController.java @@ -100,7 +100,7 @@ public class ReceiveController extends HuahengBaseController { @ApiOperation(value = "入库单-生成任务", notes = "入库单-生成任务") @PostMapping("/receivingAndCreateTask") @ResponseBody - public Result<TaskHeader> receivingAndCreateTask(@RequestBody List<Receive> receiveList, HttpServletRequest req) { + public Result receivingAndCreateTask(@RequestBody List<Receive> receiveList, HttpServletRequest req) { String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); String lockKey = warehouseCode; Result result = handleMultiProcess("receivingAndCreateTask", lockKey, new MultiProcessListener() { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/IReceiveService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/IReceiveService.java index 684c3b5..a98e650 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/IReceiveService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/IReceiveService.java @@ -2,6 +2,7 @@ package org.jeecg.modules.wms.receipt.receiving.service; import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader; import org.jeecg.modules.wms.receipt.receiving.domain.Receive; import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; @@ -14,7 +15,7 @@ import java.util.List; */ public interface IReceiveService extends IService<Receive> { - Result receiving(List<Receive> receiveList, String warehouseCode); + Result<ReceiptContainerHeader> receiving(List<Receive> receiveList, String warehouseCode); Result<TaskHeader> receivingAndCreateTask(List<Receive> receiveList, String warehouseCode); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java index 937e008..e6b0176 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java @@ -222,7 +222,7 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi combinationModel.setShipQty(inventoryQty); shipmentQty = shipmentQty.subtract(inventoryQty); } - Result result = huahengMultiHandlerService.combination(combinationModel); + Result result = shipmentCombinationService.combination(combinationModel); if (!result.isSuccess()) { throw new JeecgBootException(result.getMessage()); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java index ab81285..6f18a45 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java @@ -867,7 +867,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea } @Override - @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) + @Transactional public Result sendTaskToWcs(Integer taskId) { TaskHeader taskHeader = taskHeaderService.getById(taskId); if (taskHeader == null) { @@ -1670,7 +1670,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea @Transactional(rollbackFor = Exception.class) public Result completeTaskUnLockContainerAndLocation(String containerFillStatus, int taskType, String containerCode, String fromLocationCode, String toLocationCode, String warehouseCode) { - Result result = null; boolean success = false; if (StringUtils.isEmpty(containerCode)) { return Result.error("任务类型" + taskType + "完成任务时, 容器编码为空"); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java index 09c1ea2..b7c4214 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java @@ -17,6 +17,7 @@ import org.jeecg.utils.support.ApiAuthentication; import org.jeecg.utils.support.RSA256Key; import org.jeecg.utils.support.SystemAuthentication; import org.jeecg.utils.support.SystemRSA256Key; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -35,8 +36,13 @@ import cn.hutool.core.util.StrUtil; @Component public class HuahengJwtUtil { - /** token失效时间 1天 */ - public static final long EXPIRE_TIME = 12 * 60 * 60 * 1000; + /** Token失效时间 */ + private static Long TOKEN_EXPIRE_TIME; + + @Value("${system.token.expireTime}") + public void setExpireTime(String expireTime) { + TOKEN_EXPIRE_TIME = Long.parseLong(expireTime); + } /** 仓库视察员角色 */ public static final String USER_ROLE_INSPECTOR = "inspector"; @@ -164,7 +170,7 @@ public class HuahengJwtUtil { * @return 加密的token */ public static String sign(String username, String secret) { - Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); + Date date = new Date(System.currentTimeMillis() + TOKEN_EXPIRE_TIME); Algorithm algorithm = Algorithm.HMAC256(secret); // 附带username信息 return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm); @@ -179,7 +185,7 @@ public class HuahengJwtUtil { * @return 加密的token */ public static String sign(String username, String secret, String warehouseCode, List<String> roles) { - Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); + Date date = new Date(System.currentTimeMillis() + TOKEN_EXPIRE_TIME); Algorithm algorithm = Algorithm.HMAC256(secret); // 附带username信息 return JWT.create().withClaim("username", username).withClaim("warehouseCode", warehouseCode).withClaim("roles", roles).withExpiresAt(date).sign(algorithm); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/ApiAuthenticationAspect.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/ApiAuthenticationAspect.java index 6afd4b1..117c3fc 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/ApiAuthenticationAspect.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/ApiAuthenticationAspect.java @@ -25,6 +25,8 @@ import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.interfaces.DecodedJWT; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; import lombok.extern.slf4j.Slf4j; /** @@ -37,13 +39,13 @@ import lombok.extern.slf4j.Slf4j; @Component @EnableAsync public class ApiAuthenticationAspect { - + /** 全局认证TOKEN */ - private String token = "MTY3OTU1MTE0MCwib3BlcmF0b3IiOiJIVUFIRU5HLVdNUzQiLCJqdGkiOiI3ZGExMDQyYS1iMDBhLTQzZmMtOTliO"; + private String token = "MTY3OTU1MTE0MCwib3BlcmF0b3IiOiJIVUFIRU5HLVdNUzQiLCJqdGkiOiI3ZGExMDQyYS1iMDBhLTQzZmMtOTliO"; @Autowired private RSA256Key rsa256Key; - + @Autowired private ApplicationConfig applicationConfig; @@ -79,21 +81,19 @@ public class ApiAuthenticationAspect { } try { if (token.equals("MTY3OTU1MTE0MCwib3BlcmF0b3IiOiJIVUFIRU5HLVdNUzQiLCJqdGkiOiI3ZGExMDQyYS1iMDBhLTQzZmMtOTliO")) { + log.error("API Authentication token 非法使用"); return; } Algorithm algorithm = Algorithm.RSA256(rsa256Key.getPublicKey(), rsa256Key.getPrivateKey()); JWTVerifier verifier = JWT.require(algorithm).withIssuer(applicationConfig.getArtifactId()).build(); DecodedJWT jwt = verifier.verify(token); - new ApiAuthentication.ApiAuthenticationBuild() - .operator(jwt.getClaim("operator").asString()) - .audience(jwt.getAudience().get(0)) - .issuer(jwt.getIssuer()) - .issuedAt(jwt.getIssuedAt()) - .expireDateTime(jwt.getExpiresAt()) - .bulid(); + new ApiAuthentication.ApiAuthenticationBuild().operator(jwt.getClaim("operator").asString()).audience(jwt.getAudience().get(0)).issuer(jwt.getIssuer()) + .issuedAt(jwt.getIssuedAt()).expireDateTime(jwt.getExpiresAt()).bulid(); if (jwt.getClaim("operator").asString().equals(jwt.getIssuer())) { throw new RuntimeException("Authentication token error"); } + log.info("API Authentication token info: 使用方: {}, 提供方: {}, 失效时间: {}", jwt.getAudience().get(0), jwt.getClaim("operator").asString(), + DateUtil.format(jwt.getExpiresAt(), DatePattern.NORM_DATETIME_PATTERN)); } catch (JWTVerificationException e) { log.error(e.getMessage()); throw e; diff --git a/huaheng-wms-core/src/main/resources/application-dev.yml b/huaheng-wms-core/src/main/resources/application-dev.yml index da20945..7bcba6a 100644 --- a/huaheng-wms-core/src/main/resources/application-dev.yml +++ b/huaheng-wms-core/src/main/resources/application-dev.yml @@ -355,3 +355,7 @@ third-app: # appSecret client-secret: ?? agent-id: ?? +system: + token: + # 登录TOKEN缓存1年 + expireTime: 31536000000 diff --git a/huaheng-wms-core/src/main/resources/application-prod.yml b/huaheng-wms-core/src/main/resources/application-prod.yml index 4831464..f073562 100644 --- a/huaheng-wms-core/src/main/resources/application-prod.yml +++ b/huaheng-wms-core/src/main/resources/application-prod.yml @@ -355,3 +355,7 @@ third-app: # appSecret client-secret: ?? agent-id: ?? +system: + token: + # 登录TOKEN缓存12小时 + expireTime: 43200000 diff --git a/huaheng-wms-core/src/main/resources/application-test.yml b/huaheng-wms-core/src/main/resources/application-test.yml index e7dac85..8034877 100644 --- a/huaheng-wms-core/src/main/resources/application-test.yml +++ b/huaheng-wms-core/src/main/resources/application-test.yml @@ -356,3 +356,7 @@ third-app: # appSecret client-secret: ?? agent-id: ?? +system: + token: + # 登录TOKEN缓存1年 + expireTime: 31536000000