From 63f493ec3d9fa5a77cf6251c40e9192b2339a796 Mon Sep 17 00:00:00 2001 From: Mrking <782276617@qq.com> Date: Wed, 13 Nov 2024 20:52:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=B7=9F=E5=8D=95=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../saleorder/SaleOrderServiceImpl.java | 16 ++++++++ .../admin/user/vo/user/UserSaveReqVO.java | 3 ++ .../dal/dataobject/brand/UserBrandDO.java | 40 +++++++++++++++++++ .../dal/dataobject/user/AdminUserDO.java | 5 +++ .../dal/mysql/brand/UserBrandMapper.java | 33 +++++++++++++++ .../service/user/AdminUserServiceImpl.java | 29 +++++++++++++- .../src/views/oms/saleorder/detail/index.vue | 23 +++++++++++ .../src/views/oms/saleorder/index.vue | 19 +++++++-- .../src/views/system/user/UserForm.vue | 19 +++++++++ 9 files changed, 183 insertions(+), 4 deletions(-) create mode 100644 hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/dataobject/brand/UserBrandDO.java create mode 100644 hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/mysql/brand/UserBrandMapper.java diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java index de4ecf6..8a3b002 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java @@ -273,6 +273,12 @@ public class SaleOrderServiceImpl implements SaleOrderService { saleOrder.setBillStatus(BillStatusEnum.INVALID.getValue()); saleOrder.setOrderStatus(SaleOrderStatusEnum.YXD.getValue()); saleOrderMapper.updateById(saleOrder); + }else{ + if(StringUtils.equalsAny(saleOrder.getBillStatus(),BillStatusEnum.AUDIT.getValue(),BillStatusEnum.YPLAN.getValue())){ + throw new ServiceException(001,"订单状态已审核/已排产,不允许作废!"); + }else{ + throw new ServiceException(001,"只允许提交驳回订单!"); + } } } break; @@ -371,6 +377,16 @@ public class SaleOrderServiceImpl implements SaleOrderService { } } break; + case "unaudit": //审核 + for (SaleOrderDO saleOrder : saleOrders) { + if(!BillStatusEnum.AUDIT.getValue().equals(saleOrder.getBillStatus())) { + throw new ServiceException(001,"订单状态不等于已审核状态,不允许反审核!"); + } + saleOrder.setBillStatus(BillStatusEnum.SUBMIT.getValue()); + saleOrder.setOrderStatus(SaleOrderStatusEnum.YXD.getValue()); + saleOrderMapper.updateById(saleOrder); + } + break; } } diff --git a/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/controller/admin/user/vo/user/UserSaveReqVO.java index 51c42e9..87638e9 100644 --- a/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/controller/admin/user/vo/user/UserSaveReqVO.java +++ b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/controller/admin/user/vo/user/UserSaveReqVO.java @@ -77,4 +77,7 @@ public class UserSaveReqVO { || (ObjectUtil.isAllNotEmpty(password)); // 新增时,必须都传递 password } + //二开字段 + @Schema(description = "品牌编号数组", example = "1") + private Set brandIds; } diff --git a/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/dataobject/brand/UserBrandDO.java b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/dataobject/brand/UserBrandDO.java new file mode 100644 index 0000000..e11b60a --- /dev/null +++ b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/dataobject/brand/UserBrandDO.java @@ -0,0 +1,40 @@ +package cn.hangtag.module.system.dal.dataobject.brand; + +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; +import cn.hangtag.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户和岗位关联 + * + * @author ruoyi + */ +@TableName("oms_user_brand") +@KeySequence("system_user_brand_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class UserBrandDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 用户 ID + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long userId; + /** + * 品牌 ID + * + * 关联 {@link BrandDO#getId()} + */ + private Long brandId; + +} diff --git a/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/dataobject/user/AdminUserDO.java b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/dataobject/user/AdminUserDO.java index 39cefbd..6cb56a0 100644 --- a/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/dataobject/user/AdminUserDO.java +++ b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/dataobject/user/AdminUserDO.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -93,4 +94,8 @@ public class AdminUserDO extends TenantBaseDO { */ private LocalDateTime loginDate; + //二开字段 + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set brandIds; + } diff --git a/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/mysql/brand/UserBrandMapper.java b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/mysql/brand/UserBrandMapper.java new file mode 100644 index 0000000..efa4d24 --- /dev/null +++ b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/dal/mysql/brand/UserBrandMapper.java @@ -0,0 +1,33 @@ +package cn.hangtag.module.system.dal.mysql.brand; + +import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; +import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.hangtag.module.system.dal.dataobject.brand.UserBrandDO; +import cn.hangtag.module.system.dal.dataobject.dept.UserPostDO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface UserBrandMapper extends BaseMapperX { + + default List selectListByUserId(Long userId) { + return selectList(UserBrandDO::getUserId, userId); + } + + default void deleteByUserIdAndPostId(Long userId, Collection postIds) { + delete(new LambdaQueryWrapperX() + .eq(UserBrandDO::getUserId, userId) + .in(UserBrandDO::getBrandId, postIds)); + } + + default List selectListByBrandIds(Collection brandIds) { + return selectList(UserBrandDO::getBrandId, brandIds); + } + + default void deleteByUserId(Long userId) { + delete(Wrappers.lambdaUpdate(UserBrandDO.class).eq(UserBrandDO::getUserId, userId)); + } +} diff --git a/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/service/user/AdminUserServiceImpl.java b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/service/user/AdminUserServiceImpl.java index 90df7fb..63427dd 100644 --- a/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/service/user/AdminUserServiceImpl.java +++ b/hangtag-module-system/hangtag-module-system-biz/src/main/java/cn/hangtag/module/system/service/user/AdminUserServiceImpl.java @@ -1,5 +1,7 @@ package cn.hangtag.module.system.service.user; +import cn.hangtag.module.system.dal.dataobject.brand.UserBrandDO; +import cn.hangtag.module.system.dal.mysql.brand.UserBrandMapper; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.io.IoUtil; @@ -74,9 +76,10 @@ public class AdminUserServiceImpl implements AdminUserService { @Resource @Lazy // 延迟,避免循环依赖报错 private TenantService tenantService; - @Resource private UserPostMapper userPostMapper; + @Resource + private UserBrandMapper userBrandMapper; @Resource private FileApi fileApi; @@ -106,6 +109,11 @@ public class AdminUserServiceImpl implements AdminUserService { userPostMapper.insertBatch(convertList(user.getPostIds(), postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId))); } + // 2.3 插入关联品牌 + if (CollectionUtil.isNotEmpty(user.getBrandIds())) { + userBrandMapper.insertBatch(convertList(user.getBrandIds(), + brandId -> new UserBrandDO().setUserId(user.getId()).setBrandId(brandId))); + } // 3. 记录操作日志上下文 LogRecordContext.putVariable("user", user); @@ -127,6 +135,8 @@ public class AdminUserServiceImpl implements AdminUserService { userMapper.updateById(updateObj); // 2.2 更新岗位 updateUserPost(updateReqVO, updateObj); + // 2.2 更新品牌 + updateUserBrand(updateReqVO, updateObj); // 3. 记录操作日志上下文 LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldUser, UserSaveReqVO.class)); @@ -150,6 +160,23 @@ public class AdminUserServiceImpl implements AdminUserService { } } + private void updateUserBrand(UserSaveReqVO reqVO, AdminUserDO updateObj) { + Long userId = reqVO.getId(); + Set dbBrandIds = convertSet(userBrandMapper.selectListByUserId(userId), UserBrandDO::getBrandId); + // 计算新增和删除的品牌编号 + Set brandIds = CollUtil.emptyIfNull(updateObj.getBrandIds()); + Collection createBrandIds = CollUtil.subtract(brandIds, dbBrandIds); + Collection deleteBrandIds = CollUtil.subtract(dbBrandIds, brandIds); + // 执行新增和删除。对于已经授权的品牌,不用做任何处理 + if (!CollectionUtil.isEmpty(createBrandIds)) { + userBrandMapper.insertBatch(convertList(createBrandIds, + brandId -> new UserBrandDO().setUserId(userId).setBrandId(brandId))); + } + if (!CollectionUtil.isEmpty(deleteBrandIds)) { + userBrandMapper.deleteByUserIdAndPostId(userId, deleteBrandIds); + } + } + @Override public void updateUserLogin(Long id, String loginIp) { userMapper.updateById(new AdminUserDO().setId(id).setLoginIp(loginIp).setLoginDate(LocalDateTime.now())); diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/detail/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/detail/index.vue index b4b7ccc..8f31bfc 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/detail/index.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/detail/index.vue @@ -10,6 +10,11 @@ type="primary" @click="handleAudit" >审核 + 反审核 { } catch {} } + +/** 审核 */ +const handleUnAudit = async () => { + try { + // 校验表单 + await itemFormEntrysRef.value.validate() + // 二次确认 + await message.confirm('确认反审核订单吗?') + // 保存 + //await SaleOrderApi.updateOrderEntrys(formData.value) + // 提交 + await SaleOrderApi.updateSaleOrderBillStatus([formData.value.id],'unaudit') + message.success('反审核成功') + // 刷新列表 + await getDetail() + } catch {} +} + /** 获得详情 */ const { params } = useRoute() // 查询参数 const props = defineProps({ diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue index 4d5df42..93b89d3 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue @@ -145,6 +145,14 @@ > 审核 + + 反审核 + - 导出 + 导出 @@ -450,7 +458,11 @@ const handleUpdateBillStatus = async (operateKey: string) => { return; } if("audit" == operateKey && vals!='B'){ - message.error("请选择单据状态已提交的数据行"); + message.error("请选择订单状态已提交的数据行"); + return; + } + if("unaudit" == operateKey && vals!='C'){ + message.error("请选择订单状态待排产的数据行"); return; } if("invalid" == operateKey){ @@ -462,13 +474,14 @@ const handleUpdateBillStatus = async (operateKey: string) => { return; } } - debugger // 审批的二次确认 let operateName = '' if(operateKey === 'submit'){ operateName = '提交' }else if(operateKey === "audit"){ operateName = '审核' + }else if(operateKey === "unaudit"){ + operateName = '反审核' }else if(operateKey === "invalid"){ operateName = '作废' }else { diff --git a/hangtag-ui/hangtag-ui-admin/src/views/system/user/UserForm.vue b/hangtag-ui/hangtag-ui-admin/src/views/system/user/UserForm.vue index e6fe350..a07c9f5 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/system/user/UserForm.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/system/user/UserForm.vue @@ -81,6 +81,20 @@ + + + + + + + + + @@ -100,6 +114,7 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { CommonStatusEnum } from '@/utils/constants' import { defaultProps, handleTree } from '@/utils/tree' import * as PostApi from '@/api/system/post' +import * as BrandApi from "@/api/oms/brand"; import * as DeptApi from '@/api/system/dept' import * as UserApi from '@/api/system/user' import { FormRules } from 'element-plus' @@ -133,6 +148,7 @@ const formRules = reactive({ password: [{ required: true, message: '用户密码不能为空', trigger: 'blur' }], email: [ { + required: true, type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] @@ -149,6 +165,7 @@ const formRules = reactive({ const formRef = ref() // 表单 Ref const deptList = ref([]) // 树形结构 const postList = ref([] as PostApi.PostVO[]) // 岗位列表 +const brandList = ref([] as BrandApi.BrandVO[]) // 品牌列表 /** 打开弹窗 */ const open = async (type: string, id?: number) => { @@ -169,6 +186,8 @@ const open = async (type: string, id?: number) => { deptList.value = handleTree(await DeptApi.getSimpleDeptList()) // 加载岗位列表 postList.value = await PostApi.getSimplePostList() + // 加载品牌列表 + brandList.value = await BrandApi.getSimpleBrandList() } defineExpose({ open }) // 提供 open 方法,用于打开弹窗