Compare commits

...

2 Commits

Author SHA1 Message Date
chenhao 0b1d0f45cc fix(inventory): 修正采购订单导入逻辑及产品类型查询条件
- 修改了采购订单导入前的判断逻辑,确保新华三产品类型正确处理
- 在内部库存查询中增加了产品类型'70'的支持
- 更新了用户个人资料页面的部门显示逻辑
- 移除了控制台调试日志输出
- 新增批量审批订单功能接口与实现
- 优化项目选择回调函数并同步 shipmentAmount 字段
- 修正采购订单详情中的制造商名称显示问题
- 在采购订单明细中增加税率展示列
- 更新用户密码重置接口调用方式和参数结构
- 调整后端获取用户信息接口路径以支持 Vue 页面需求
2025-12-12 10:59:03 +08:00
chenhao 25cc3d18fa feat(inventory): 新增产品类型字段并优化采购逻辑
- 在库存出库明细实体类中新增 productType 字段
- 更新对应的 MyBatis Mapper 文件以支持 productType 查询
- 在库存外部服务实现中设置 productType 属性值
- 修改内部库存服务逻辑,针对特定供应商调整订单类型判断条件
- 增加对“新华三”开头供应商名称的特殊处理逻辑
- 路由配置新增采购审批及审批历史相关页面路径
- 审批订单和采购审批页面增加跳转至审批历史按钮
- 新增审批历史页面基础结构与返回功能
- 出库单生成前导入逻辑增加对 vendorName 和 productType 的控制台打印用于调试
2025-12-09 10:43:24 +08:00
22 changed files with 142 additions and 23 deletions

View File

@ -79,7 +79,7 @@ export function changeUserStatus(userId, status) {
// 查询用户个人信息 // 查询用户个人信息
export function getUserProfile() { export function getUserProfile() {
return request({ return request({
url: '/system/user/profile', url: '/system/user/profile/vue',
method: 'get' method: 'get'
}) })
} }
@ -94,14 +94,11 @@ export function updateUserProfile(data) {
} }
// 用户密码重置 // 用户密码重置
export function updateUserPwd(oldPassword, newPassword) { export function updateUserPwd(data) {
const data = {
oldPassword,
newPassword
}
return request({ return request({
url: '/system/user/profile/updatePwd', url: '/system/user/profile/resetPwd',
method: 'put', method: 'post',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: data data: data
}) })
} }

View File

@ -74,6 +74,28 @@ export const constantRoutes = [
} }
] ]
}, },
{
path: '/purchase',
component: Layout,
children: [
{
path: 'approved',
component: () => import('@/views/approve/purchaase/approved/index'),
hidden: true
},
]
},
{
path: '/approve',
component: Layout,
children: [
{
path: 'orderLog',
component: () => import('@/views/approve/approved_order/index'),
hidden: true
},
]
},
{ {
path: '/user', path: '/user',
component: Layout, component: Layout,

View File

@ -56,6 +56,14 @@
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
size="mini"
@click="()=>{this.$router.back()}"
>返回</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>

View File

@ -58,7 +58,18 @@
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
size="mini"
@click="toApproved()"
>审批历史</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="orderList"> <el-table v-loading="loading" :data="orderList">
<el-table-column label="合同编号" align="center" prop="orderCode" /> <el-table-column label="合同编号" align="center" prop="orderCode" />
<el-table-column label="项目名称" align="center" prop="projectName" /> <el-table-column label="项目名称" align="center" prop="projectName" />
@ -155,6 +166,11 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
toApproved(){
this.$router.push({
path: '/approve/orderLog',
});
},
/** 查询订单列表 */ /** 查询订单列表 */
getList() { getList() {
this.loading = true; this.loading = true;

View File

@ -29,7 +29,18 @@
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
size="mini"
@click="toApproved()"
>审批历史</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="purchaseorderList"> <el-table v-loading="loading" :data="purchaseorderList">
<!-- 表格列定义 --> <!-- 表格列定义 -->
<el-table-column label="序号" type="index" width="50" align="center" /> <el-table-column label="序号" type="index" width="50" align="center" />
@ -122,6 +133,7 @@ export default {
loading: true, loading: true,
showSearch: true, showSearch: true,
total: 0, total: 0,
confirmDialogTitle:'',
purchaseorderList: [], purchaseorderList: [],
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
@ -168,6 +180,9 @@ export default {
}); });
}, },
methods: { methods: {
toApproved(){
this.$router.push( '/purchase/approved' )
},
// //
getList() { getList() {
this.loading = true; this.loading = true;

View File

@ -29,7 +29,18 @@
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
size="mini"
@click="()=>{this.$router.back()}"
>返回</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="purchaseorderList"> <el-table v-loading="loading" :data="purchaseorderList">
<!-- 表格列定义 --> <!-- 表格列定义 -->
<el-table-column label="序号" type="index" width="50" align="center" /> <el-table-column label="序号" type="index" width="50" align="center" />

View File

@ -421,7 +421,7 @@ export default {
handleQuery() { handleQuery() {
this.queryParams.pageNum = 1; this.queryParams.pageNum = 1;
if (this.activeTab==='service'){ if (this.activeTab==='service'){
this.queryParams.productTypeList = ['11','22']; this.queryParams.productTypeList = ['11','22','70'];
}else{ }else{
this.queryParams.productTypeList = ['1','2','99']; this.queryParams.productTypeList = ['1','2','99'];
} }
@ -452,7 +452,7 @@ export default {
this.reset(); this.reset();
if (type==='maintenance'){ if (type==='maintenance'){
this.isServiceIn = true; this.isServiceIn = true;
this.queryProductType=['11','22'] this.queryProductType=['11','22','70']
}else{ }else{
this.isServiceIn = false; this.isServiceIn = false;
this.queryProductType=['1','2','99'] this.queryProductType=['1','2','99']

View File

@ -177,7 +177,7 @@ export default {
}); });
}, },
handleSelectPurchaseBeforeImport() { handleSelectPurchaseBeforeImport() {
if ((this.productData.orderType || '1') === '1') { if (((this.productData.orderType || '1') === '1' ) && !(this.outerData.vendorName.startsWith('新华三') && this.productData.productType==='2')) {
this.purchaseOrderSelectVisible = true; this.purchaseOrderSelectVisible = true;
}else{ }else{
this.handleImport() this.handleImport()

View File

@ -149,7 +149,7 @@
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
<select-project :visible.sync="selectProjectVisible" @project-selected="handleProjectSelected"/> <select-project :visible.sync="selectProjectVisible" @project-selected="selectProject"/>
<select-user :visible.sync="selectUserVisible" @user-selected="handleUserSelected"/> <select-user :visible.sync="selectUserVisible" @user-selected="handleUserSelected"/>
<select-partner :visible.sync="selectPartnerVisible" @partner-selected="handlePartnerSelected"/> <select-partner :visible.sync="selectPartnerVisible" @partner-selected="handlePartnerSelected"/>
<select-commit-type :visible.sync="selectCommitTypeVisible" :order-channel="form.orderChannel" @commit-type-selected="handleCommitTypeSelected"/> <select-commit-type :visible.sync="selectCommitTypeVisible" :order-channel="form.orderChannel" @commit-type-selected="handleCommitTypeSelected"/>
@ -400,8 +400,6 @@ export default {
] ]
}); });
this.activeContractVersionTab = currentVersion; this.activeContractVersionTab = currentVersion;
console.log('11111')
console.log(this.projectId)
if (this.projectId) { if (this.projectId) {
getProject(this.projectId).then(response => { getProject(this.projectId).then(response => {
this.handleProjectSelected(response.data.project); this.handleProjectSelected(response.data.project);
@ -409,6 +407,11 @@ export default {
} }
} }
}, },
selectProject(projectData){
getProject(projectData.id).then(response => {
this.handleProjectSelected(response.data.project);
});
},
handleClose() { handleClose() {
this.$emit('update:visible', false); this.$emit('update:visible', false);
}, },
@ -505,6 +508,7 @@ export default {
this.form.industryType = projectData.industryType; this.form.industryType = projectData.industryType;
this.isProjectSelected = true; this.isProjectSelected = true;
this.selectProjectVisible = false; this.selectProjectVisible = false;
this.form.shipmentAmount = this.totalConfigAmount;
}, },
openSelectPeople() { openSelectPeople() {
this.selectUserVisible = true; this.selectUserVisible = true;

View File

@ -19,7 +19,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="制造商" prop="vendorId"> <el-form-item label="制造商" prop="vendorId">
<el-select v-model="form.vendorId" placeholder="请选择制造商" style="width:100%" @change="handleVendorChange"> <el-select v-model="form.vendorId" placeholder="请选择制造商" style="width:100%" @change="handleVendorChange">
<el-option v-for="item in vendorOptions" :key="item.vendorId" :label="item.vendorName" :value="item.vendorId"></el-option> <el-option v-for="item in vendorOptions" :key="item.vendorId" :label="item.vendorAddress" :value="item.vendorId"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -27,7 +27,7 @@
<el-row v-if="selectedVendor.vendorId"> <el-row v-if="selectedVendor.vendorId">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="制造商名称"> <el-form-item label="制造商名称">
<span>{{ selectedVendor.vendorAddress }}</span> <span>{{ selectedVendor.vendorName }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">

View File

@ -142,6 +142,11 @@
<span>{{ scope.row.price }}</span> <span>{{ scope.row.price }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="税率(%)" prop="taxRate">
<template slot-scope="scope">
<span>{{ scope.row.taxRate *100}}</span>
</template>
</el-table-column>
<el-table-column label="含税小计" prop="amountTotal"></el-table-column> <el-table-column label="含税小计" prop="amountTotal"></el-table-column>
<el-table-column label="交货日期"> <el-table-column label="交货日期">
<template slot-scope="scope"> <template slot-scope="scope">

View File

@ -25,7 +25,7 @@
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="tree" />所属部门 <svg-icon icon-class="tree" />所属部门
<div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div> <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} </div>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="peoples" />所属角色 <svg-icon icon-class="peoples" />所属角色
@ -86,8 +86,8 @@ export default {
getUser() { getUser() {
getUserProfile().then(response => { getUserProfile().then(response => {
this.user = response.data this.user = response.data
this.roleGroup = response.roleGroup this.roleGroup = this.user.roles.map(item=>item.roleName).join(',')
this.postGroup = response.postGroup
}) })
} }
} }

View File

@ -55,7 +55,14 @@ export default {
submit() { submit() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
if (valid) { if (valid) {
updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => { let data={
userId:this.user.userId,
loginName:this.user.loginName,
oldPassword: this.user.oldPassword,
newPassword: this.user.newPassword,
confirmPassword: this.user.newPassword
}
updateUserPwd(data).then(response => {
this.$modal.msgSuccess("修改成功") this.$modal.msgSuccess("修改成功")
}) })
} }

View File

@ -56,6 +56,14 @@ public class SysProfileController extends BaseController
mmap.put("postGroup", userService.selectUserPostGroup(user.getUserId())); mmap.put("postGroup", userService.selectUserPostGroup(user.getUserId()));
return prefix + "/profile"; return prefix + "/profile";
} }
@GetMapping("/vue")
@ResponseBody
public AjaxResult profileVue()
{
SysUser user = getSysUser();
return AjaxResult.success(user);
}
@GetMapping("/checkPassword") @GetMapping("/checkPassword")
@ResponseBody @ResponseBody

View File

@ -142,6 +142,13 @@ public class ProjectOrderInfoController extends BaseController
// return prefix + "/approve"; // return prefix + "/approve";
return AjaxResult.success(); return AjaxResult.success();
} }
@PostMapping("/order/approve/batch")
@ResponseBody
public AjaxResult approveOrderBatch(@RequestBody Todo todo) {
projectOrderInfoService.approveOrderBatch(todo);
return AjaxResult.success();
}
/** /**
* *
*/ */

View File

@ -42,5 +42,6 @@ public class InventoryOuterDetail extends BaseEntity
private String productCode; private String productCode;
private String model; private String model;
private String productName; private String productName;
private String productType;
} }

View File

@ -103,4 +103,6 @@ public interface IProjectOrderInfoService
String financeExport(ProjectOrderInfo projectOrderInfo); String financeExport(ProjectOrderInfo projectOrderInfo);
void approveOrderBatch(Todo todo);
} }

View File

@ -271,6 +271,7 @@ public class InventoryOuterServiceImpl implements IInventoryOuterService
vo.setId(item.getId()); vo.setId(item.getId());
vo.setProductCode(item.getProductCode()); vo.setProductCode(item.getProductCode());
vo.setModel(item.getModel()); vo.setModel(item.getModel());
vo.setProductType(item.getProductType());
vo.setQuantity(item.getQuantity()); vo.setQuantity(item.getQuantity());
vo.setWarehouseId(item.getWarehouseId()); vo.setWarehouseId(item.getWarehouseId());
vo.setWarehouseName(item.getWarehouseName()); vo.setWarehouseName(item.getWarehouseName());

View File

@ -272,7 +272,7 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService {
throw new ServiceException("产品编码对应产品未找到"); throw new ServiceException("产品编码对应产品未找到");
} }
Map<String, OmsWarehouseInfo> warehouseInfoMap=Collections.emptyMap(); Map<String, OmsWarehouseInfo> warehouseInfoMap=Collections.emptyMap();
if ("2".equalsIgnoreCase(orderType)){ if ("2".equalsIgnoreCase(orderType) || (("2".equalsIgnoreCase(productInfos.get(0).getType()) && productInfos.get(0).getVendorName().startsWith("新华三"))) ){
List<String> warehouseNameList = inventoryInfoExcelDtoList.stream().map(InventoryInfoExcelDto::getWarehouseName).distinct().collect(Collectors.toList()); List<String> warehouseNameList = inventoryInfoExcelDtoList.stream().map(InventoryInfoExcelDto::getWarehouseName).distinct().collect(Collectors.toList());
if (warehouseNameList.size() > 1){ if (warehouseNameList.size() > 1){
throw new ServiceException("导入清单只能有一个仓库"); throw new ServiceException("导入清单只能有一个仓库");
@ -293,7 +293,7 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService {
info.setModel(productInfos.get(0).getModel()); info.setModel(productInfos.get(0).getModel());
info.setProductDesc(productInfos.get(0).getDescription()); info.setProductDesc(productInfos.get(0).getDescription());
info.setInnerPrice(item.getInnerPrice()); info.setInnerPrice(item.getInnerPrice());
if ("2".equalsIgnoreCase(orderType)){ if ("2".equalsIgnoreCase(orderType)|| (("2".equalsIgnoreCase(productInfos.get(0).getType()) && productInfos.get(0).getVendorName().startsWith("新华三"))) ){
OmsWarehouseInfo omsWarehouseInfo = finalWarehouseInfoMap.get(item.getWarehouseName()); OmsWarehouseInfo omsWarehouseInfo = finalWarehouseInfoMap.get(item.getWarehouseName());
info.setWarehouseId(omsWarehouseInfo.getId()); info.setWarehouseId(omsWarehouseInfo.getId());
info.setWarehouseName(omsWarehouseInfo.getWarehouseName()); info.setWarehouseName(omsWarehouseInfo.getWarehouseName());

View File

@ -1552,6 +1552,19 @@ public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService, To
} }
} }
@Override
public void approveOrderBatch(Todo todo) {
Todo query = new Todo();
query.setApproveUser(getSysUser().getUserId().toString());
query.setProcessKeyList(Arrays.asList(orderOnlineFlowKey,orderOfflineFlowKey));
List<Todo> list = todoService.selectTodoList(query);
for (Todo todo1 : list) {
todo1.setVariables(new HashMap<>(todo.getVariables()));
approveOrder(todo1);
}
}
/** /**
* sheet * sheet
* *

View File

@ -28,5 +28,6 @@ public class OuterDeliveryProductVo {
private String warehouseName; private String warehouseName;
private String orderType; private String orderType;
private Long warehouseId; private Long warehouseId;
private String productType;
} }

View File

@ -21,7 +21,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t2.warehouse_name, t2.warehouse_name,
t4.product_code, t4.product_code,
t4.model, t4.model,
t4.available_count t4.available_count,
t4.type as product_type
from oms_inventory_outer_detail t1 from oms_inventory_outer_detail t1
left join oms_warehouse_info t2 on t1.warehouse_id=t2.id left join oms_warehouse_info t2 on t1.warehouse_id=t2.id
left join oms_inventory_outer t3 on t1.outer_code=t3.outer_code left join oms_inventory_outer t3 on t1.outer_code=t3.outer_code