Merge branch 'dev' of https://git.yfgame.vip/r/hangtag into dev

This commit is contained in:
YuanFeng 2024-11-16 14:06:06 +08:00
commit cf54cbf47c
11 changed files with 209 additions and 10 deletions

View File

@ -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;
}
}

View File

@ -77,4 +77,7 @@ public class UserSaveReqVO {
|| (ObjectUtil.isAllNotEmpty(password)); // 新增时必须都传递 password
}
//二开字段
@Schema(description = "品牌编号数组", example = "1")
private Set<Long> brandIds;
}

View File

@ -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") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 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;
}

View File

@ -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<Long> brandIds;
}

View File

@ -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<UserBrandDO> {
default List<UserBrandDO> selectListByUserId(Long userId) {
return selectList(UserBrandDO::getUserId, userId);
}
default void deleteByUserIdAndPostId(Long userId, Collection<Long> postIds) {
delete(new LambdaQueryWrapperX<UserBrandDO>()
.eq(UserBrandDO::getUserId, userId)
.in(UserBrandDO::getBrandId, postIds));
}
default List<UserBrandDO> selectListByBrandIds(Collection<Long> brandIds) {
return selectList(UserBrandDO::getBrandId, brandIds);
}
default void deleteByUserId(Long userId) {
delete(Wrappers.lambdaUpdate(UserBrandDO.class).eq(UserBrandDO::getUserId, userId));
}
}

View File

@ -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<Long> dbBrandIds = convertSet(userBrandMapper.selectListByUserId(userId), UserBrandDO::getBrandId);
// 计算新增和删除的品牌编号
Set<Long> brandIds = CollUtil.emptyIfNull(updateObj.getBrandIds());
Collection<Long> createBrandIds = CollUtil.subtract(brandIds, dbBrandIds);
Collection<Long> 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()));
@ -315,7 +342,7 @@ public class AdminUserServiceImpl implements AdminUserService {
* @return 部门编号集合
*/
private Set<Long> getDeptCondition(Long deptId) {
if (deptId == null) {
if (deptId == null || deptId == 0) {
return Collections.emptySet();
}
Set<Long> deptIds = convertSet(deptService.getChildDeptList(deptId), DeptDO::getId);

View File

@ -10,6 +10,11 @@
type="primary"
@click="handleAudit"
>审核</el-button>
<el-button
v-if="formData.billStatus == 'C'"
type="primary"
@click="handleUnAudit"
>反审核</el-button>
<el-button
v-if="formData.billStatus == 'A' || formData.billStatus == 'B' "
type="primary"
@ -242,6 +247,24 @@ const handleAudit = async () => {
} 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({

View File

@ -145,6 +145,14 @@
>
审核
</el-button>
<el-button
type="primary"
plain
@click="handleUpdateBillStatus('unaudit')"
:disabled="selectionList.length === 0"
>
反审核
</el-button>
<el-button
type="primary"
plain
@ -169,7 +177,7 @@
:loading="exportLoading"
v-hasPermi="['oms:sale-order:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:upload" class="mr-5px" /> 导出
</el-button>
</el-col>
</el-row>
@ -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 {

View File

@ -81,6 +81,20 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="品牌">
<el-select v-model="formData.brandIds" multiple placeholder="请选择">
<el-option
v-for="item in brandList"
:key="item.id"
:label="item.name"
:value="item.id!"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注">
@ -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<FormRules>({
password: [{ required: true, message: '用户密码不能为空', trigger: 'blur' }],
email: [
{
required: true,
type: 'email',
message: '请输入正确的邮箱地址',
trigger: ['blur', 'change']
@ -149,6 +165,7 @@ const formRules = reactive<FormRules>({
const formRef = ref() // Ref
const deptList = ref<Tree[]>([]) //
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

View File

@ -242,6 +242,16 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true
},
children: [
{
path: 'order/edit/:id(\\d+)',
component: () => import('@/views/oms/order/createorder/index.vue'),
name: 'SaleOrderEdit',
meta: {
title: '订单编辑',
icon: 'ep:edit',
activeMenu: '/oms/saleorder'
}
},
{
path: 'order/detail/:id(\\d+)',
component: () => import('@/views/oms/saleorder/detail/index.vue'),

View File

@ -161,7 +161,7 @@
@click="handleExport"
:loading="exportLoading"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:upload" class="mr-5px" /> 导出
</el-button>
</el-col>
</el-row>
@ -246,6 +246,15 @@
</el-button>
</router-link>
<el-button
link
type="primary"
@click="openEdit(scope.row.id)"
v-if="scope.row.billStatus == 'B' "
>
<Icon icon="ep:edit" />
编辑
</el-button>
<el-button
link
type="primary"
@ -567,16 +576,17 @@ const rejectCancel = () =>{
}
/** 订单编辑 */
const openEdit = (id: number) => {
push({ name: 'SaleOrderEdit', params: { id } })
}
/** 查看订单详情 */
const openDetail = (id: number) => {
push({ name: 'SaleOrderDetail', params: { id } })
}
const tableRowClassName = ({
row,
rowIndex,
}: {
const tableRowClassName = ({row, rowIndex}: {
row: SaleOrderVO
rowIndex: number
}) => {