增加跟单员
This commit is contained in:
parent
1b221bca72
commit
63f493ec3d
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -77,4 +77,7 @@ public class UserSaveReqVO {
|
|||
|| (ObjectUtil.isAllNotEmpty(password)); // 新增时,必须都传递 password
|
||||
}
|
||||
|
||||
//二开字段
|
||||
@Schema(description = "品牌编号数组", example = "1")
|
||||
private Set<Long> brandIds;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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()));
|
||||
|
|
|
|||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 方法,用于打开弹窗
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue