### commit message

1. rpc接口新增
   - 新增`AdminUserApi`接口,提供外勤用户查询功能。
   - 在`AdminUserService`接口中添加`getFactoryUsers`方法,用于获取工厂用户列表。
   - 在`BpmModelApi`接口中新增`getModelList`方法,用于获取流程模板列表。

2. 实体类创建与修改
   - 创建`AdminUserRpcVO`类,用于RPC调用中传输用户信息。   - 创建`AssetsStockVO`类,用于展示工厂库存信息。   - 修改`CommonlyUsedDO`类,移除`routing`字段。
   - 更新`DataOverviewVO`类,调整工厂数据总览视图结构。

3.服务与实现更新
   - 在`CommonlyUsedService`接口及其实现类中新增批量操作方法。
   - 在`DeptService`接口及其实现类中添加获取工厂部门列表的方法。
   - 更新`CommonlyUsedController`,添加批量操作接口。
   - 修改`CommonlyUsedMapper`,适配批量操作。
   - 更新`CommonlyUsedVO`,包含流程列表信息。

4. 其他修改
   - 在`AssetsTypeCodeEnum`中新增多个资产类型常量。
   - 修改`gpsPosition`方法,调整GPS位置更新逻辑。
   - 调整数据库操作,优化SQL查询条件。
This commit is contained in:
aikai 2024-09-06 18:14:24 +08:00
parent 16a6f35602
commit b83c48f2b5
43 changed files with 900 additions and 133 deletions

View File

@ -14,5 +14,20 @@ public class AssetsTypeCodeEnum {
* 叉车
*/
public static final String FORKLIFT = "FORKLIFT";
/**
* 叉车
*/
public static final String FORKLIFT_OIL = "FORKLIFT_OIL";
/**
* 叉车
*/
public static final String FORKLIFT_ELECTRICITY = "FORKLIFT_ELECTRICITY";
/**
* 托盘
*/
public static final String TRAY = "TRAY";
/**
* 绑带
*/
public static final String STRAPS = "STRAPS";
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.bpm.api.model;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.bpm.api.model.vo.BpmModelRpcVO;
import cn.iocoder.yudao.module.bpm.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
@FeignClient(name = ApiConstants.NAME) // TODO 芋艿fallbackFactory =
@Tag(name = "RPC 服务 - 流程实例")
public interface BpmModelApi {
String PREFIX = ApiConstants.PREFIX + "/oa/model";
@GetMapping(PREFIX + "/getModelList")
@Operation(summary = "获取流程模版列表")
CommonResult<List<BpmModelRpcVO>> getModelList();
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.bpm.api.model.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class BpmModelRpcVO {
@Schema(description = "id")
private String id;
@Schema(description = "名称")
private String name;
@Schema(description = "图标")
private String processImg;
@Schema(description = "路由")
private String formCustomCreatePath;
@Schema(description = "是否已选择 (用于常用菜单赛选 true 已选 false 未选)", example = "false")
private Boolean selectedFlag;
}

View File

@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.bpm.api.model;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.bpm.api.model.vo.BpmModelRpcVO;
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.repository.Model;
import org.flowable.engine.repository.ModelQuery;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* Flowable 流程实例 Api 实现类
*
* @author jason
*/
@RestController
@Validated
public class BpmModelApiImpl implements BpmModelApi {
@Resource
private RepositoryService repositoryService;
@Override
public CommonResult<List<BpmModelRpcVO>> getModelList() {
ModelQuery modelQuery = repositoryService.createModelQuery();
/**对模型添加租户*/
modelQuery.modelTenantId(TenantContextHolder.getTenantId().toString());
// 执行查询
List<Model> models = modelQuery.orderByCreateTime().desc().list();
List<BpmModelRpcVO> list = new ArrayList<>();
// -- 需要过滤的 - 列表
List<String> filterList = Arrays.asList("work_task");
for (Model model : models) {
BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
if (filterList.contains(model.getKey()) || metaInfo == null) {
continue;
}
list.add(new BpmModelRpcVO().setId(model.getId())
.setName(model.getName())
.setProcessImg(metaInfo.getProcessImg())
.setFormCustomCreatePath(metaInfo.getFormCustomCreatePath()));
}
return success(list);
}
}

View File

@ -4,10 +4,11 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.UserSaveRespDTO;
import cn.iocoder.yudao.module.system.api.user.vo.AdminUserRpcVO;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@ -75,4 +76,10 @@ public interface AdminUserApi {
@Operation(summary = "获取所有用户性质为外勤的用户")
@Parameter(name = "userNature", description = "用户性质", example = "3", required = true)
CommonResult<List<Long>> getUserIdsByUserNature(@RequestParam("userNature") Integer userNature);
@GetMapping(PREFIX + "/getFactoryUsers")
@Operation(summary = "获取同部门所有用户id")
@Parameter(name = "factoryId", description = "工厂id", example = "1024", required = false)
CommonResult<List<AdminUserRpcVO>> getFactoryUsers(@RequestParam(name = "factoryId", required = false) Long factoryId);
}

View File

@ -0,0 +1,105 @@
package cn.iocoder.yudao.module.system.api.user.vo;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.module.system.enums.common.SexEnum;
import lombok.Data;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class AdminUserRpcVO {
/**
* 用户ID
*/
private Long id;
/**
* 用户账号
*/
private String username;
/**
* 用户昵称
*/
private String nickname;
/**
* 部门 ID
*/
private Long deptId;
/**
* 用户邮箱
*/
private String email;
/**
* 手机号码
*/
private String mobile;
/**
* 身份证号码
*/
private String idcard;
/**
* 年龄
*/
private Integer age;
/**
* 生日日期
*/
private LocalDate birthdayDay;
/**
* 用户性别
* <p>
* 枚举类 {@link SexEnum}
*/
private Integer sex;
/**
* 用户头像
*/
private String avatar;
/**
* 帐号状态
* <p>
* 枚举 {@link CommonStatusEnum}
*/
private Integer status;
/**
* 是否允许外勤打卡 0否 1是
* <p>
* 枚举 {@link CommonStatusEnum}
*/
private Integer fieldworkFlag;
/**
* 用户类型
* 1公司用户 2工厂用户
*/
private Integer userType;
/**
* 用户性质
* 3正式 4外勤
*/
private Integer userNature;
/**
* 用户编制
* 5试用 6实习 7在职 8离职
*/
private Integer userStaffing;
/**
* 最后登录IP
*/
private String loginIp;
/**
* 最后登录时间
*/
private LocalDateTime loginDate;
/**
* 微信小程序openId
*/
private String openId;
}

View File

@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.UserSaveRespDTO;
import cn.iocoder.yudao.module.system.api.user.vo.AdminUserRpcVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
@ -77,4 +78,10 @@ public class AdminUserApiImpl implements AdminUserApi {
return success(convertList(userDOS, AdminUserDO::getId));
}
@Override
public CommonResult<List<AdminUserRpcVO>> getFactoryUsers(Long factoryId) {
List<AdminUserDO> factoryUsers = userService.getFactoryUsers(factoryId);
return success(BeanUtils.toBean(factoryUsers, AdminUserRpcVO.class));
}
}

View File

@ -1,33 +1,31 @@
package cn.iocoder.yudao.module.system.controller.admin.commonlyused;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.*;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedRespVO;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedVO;
import cn.iocoder.yudao.module.system.dal.dataobject.commonlyused.CommonlyUsedDO;
import cn.iocoder.yudao.module.system.service.commonlyused.CommonlyUsedService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "管理后台 - 用户常用应用配置")
@RestController
@ -45,6 +43,14 @@ public class CommonlyUsedController {
return success(commonlyUsedService.createCommonlyUsed(createReqVO));
}
@PostMapping("/batchCreate")
@Operation(summary = "批量创建用户常用应用配置")
@PreAuthorize("@ss.hasPermission('system:commonly-used:create')")
public CommonResult<?> batchCreate(@Valid @RequestBody List<CommonlyUsedSaveReqVO> list) {
commonlyUsedService.batchCreate(list);
return success(true);
}
@PutMapping("/update")
@Operation(summary = "更新用户常用应用配置")
@PreAuthorize("@ss.hasPermission('system:commonly-used:update')")
@ -53,6 +59,14 @@ public class CommonlyUsedController {
return success(true);
}
@PutMapping("/batchUpdate")
@Operation(summary = "批量更新用户常用应用配置")
@PreAuthorize("@ss.hasPermission('system:commonly-used:update')")
public CommonResult<Boolean> batchUpdate(@Valid @RequestBody List<CommonlyUsedSaveReqVO> list) {
commonlyUsedService.batchUpdate(list);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除用户常用应用配置")
@Parameter(name = "id", description = "编号", required = true)
@ -62,6 +76,14 @@ public class CommonlyUsedController {
return success(true);
}
@DeleteMapping("/batchDelete")
@Operation(summary = "批量删除用户常用应用配置")
@PreAuthorize("@ss.hasPermission('system:commonly-used:delete')")
public CommonResult<Boolean> batchDelete(@RequestBody List<Long> ids) {
commonlyUsedService.batchDelete(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得用户常用应用配置")
@Parameter(name = "id", description = "编号", required = true, example = "1024")

View File

@ -21,9 +21,6 @@ public class CommonlyUsedPageReqVO extends PageParam {
@Schema(description = "类型 1流程 2菜单", example = "1")
private Integer type;
@Schema(description = "路由地址")
private String routing;
@Schema(description = "菜单id或流程id 根据具体类型来", example = "11898")
private String objectId;

View File

@ -25,10 +25,6 @@ public class CommonlyUsedRespVO {
@ExcelProperty("类型 1流程 2菜单")
private Integer type;
@Schema(description = "路由地址")
@ExcelProperty("路由地址")
private String routing;
@Schema(description = "菜单id或流程id 根据具体类型来", example = "11898")
@ExcelProperty("菜单id或流程id 根据具体类型来")
private String objectId;
@ -49,4 +45,7 @@ public class CommonlyUsedRespVO {
@ExcelProperty("图标")
private String img;
@Schema(description = "路由地址")
@ExcelProperty("路由地址")
private String routing;
}

View File

@ -19,9 +19,6 @@ public class CommonlyUsedSaveReqVO {
@Schema(description = "类型 1流程 2菜单", example = "1")
private Integer type;
@Schema(description = "路由地址")
private String routing;
@Schema(description = "菜单id或流程id 根据具体类型来", example = "11898")
private String objectId;

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo;
import cn.iocoder.yudao.module.bpm.api.model.vo.BpmModelRpcVO;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthPermissionInfoRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -15,4 +16,7 @@ public class CommonlyUsedVO {
@Schema(description = "菜单树形列表")
private List<AuthPermissionInfoRespVO.MenuVO> menus;
@Schema(description = "流程列表")
private List<BpmModelRpcVO> modelList;
}

View File

@ -108,14 +108,12 @@ public class UserController {
return success(true);
}
@GetMapping("/gpsPosition")
@Operation(summary = "GPS定位")
public CommonResult<Boolean> gpsPosition() {
userService.gpsPosition();
@Operation(summary = "GPS用户全量更新")
public CommonResult<Boolean> gpsFullUserUpdate() {
userService.gpsFullUserUpdate();
return success(true);
}
@GetMapping("/page")
@Operation(summary = "获得用户分页列表")
@PreAuthorize("@ss.hasPermission('system:user:list')")

View File

@ -35,10 +35,7 @@ public class CommonlyUsedDO extends BaseDO {
* 类型 1流程 2菜单
*/
private Integer type;
/**
* 路由地址
*/
private String routing;
/**
* 菜单id或流程id 根据具体类型来
*/

View File

@ -21,7 +21,6 @@ public interface CommonlyUsedMapper extends BaseMapperX<CommonlyUsedDO> {
return selectPage(reqVO, new LambdaQueryWrapperX<CommonlyUsedDO>()
.eqIfPresent(CommonlyUsedDO::getUserId, reqVO.getUserId())
.eqIfPresent(CommonlyUsedDO::getType, reqVO.getType())
.eqIfPresent(CommonlyUsedDO::getRouting, reqVO.getRouting())
.eqIfPresent(CommonlyUsedDO::getObjectId, reqVO.getObjectId())
.eqIfPresent(CommonlyUsedDO::getSort, reqVO.getSort())
.betweenIfPresent(CommonlyUsedDO::getCreateTime, reqVO.getCreateTime())

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.framework.rpc.config;
import cn.iocoder.yudao.module.bpm.api.model.BpmModelApi;
import cn.iocoder.yudao.module.infra.api.file.FileApi;
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.FactoryInfoApi;
@ -7,6 +8,6 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, FactoryInfoApi.class})
@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, FactoryInfoApi.class, BpmModelApi.class})
public class RpcConfiguration {
}

View File

@ -78,7 +78,7 @@ public class AssetsTypeServiceImpl implements AssetsTypeService {
@Override
public List<Long> getAssetsTypeIdsByCode(String code) {
List<AssetsTypeDO> assetsTypeDOS = assetsTypeMapper.selectList(new LambdaQueryWrapper<AssetsTypeDO>()
.eq(AssetsTypeDO::getCode, code));
.like(AssetsTypeDO::getCode, code));
if (assetsTypeDOS.isEmpty()) {
return Collections.emptyList();
}

View File

@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.service.commonlyused;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedRespVO;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedVO;
import cn.iocoder.yudao.module.system.dal.dataobject.commonlyused.CommonlyUsedDO;
@ -61,4 +60,25 @@ public interface CommonlyUsedService {
* @return
*/
CommonlyUsedVO getCommonlyUsedList();
/**
* 批量新增
*
* @param list
*/
void batchCreate(List<CommonlyUsedSaveReqVO> list);
/**
* 批量更新
*
* @param list
*/
void batchUpdate(List<CommonlyUsedSaveReqVO> list);
/**
* 批量删除
*
* @param ids
*/
void batchDelete(List<Long> ids);
}

View File

@ -1,10 +1,12 @@
package cn.iocoder.yudao.module.system.service.commonlyused;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.bpm.api.model.BpmModelApi;
import cn.iocoder.yudao.module.bpm.api.model.vo.BpmModelRpcVO;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthPermissionInfoRespVO;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.commonlyused.vo.CommonlyUsedRespVO;
@ -24,11 +26,8 @@ import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* 用户常用应用配置 Service 实现类
*
@ -44,6 +43,8 @@ public class CommonlyUsedServiceImpl implements CommonlyUsedService {
private PermissionService permissionService;
@Resource
private MenuService menuService;
@Resource
private BpmModelApi bpmModelApi;
@Override
public Long createCommonlyUsed(CommonlyUsedSaveReqVO createReqVO) {
@ -86,18 +87,11 @@ public class CommonlyUsedServiceImpl implements CommonlyUsedService {
// -- 搜索我的常用
List<CommonlyUsedDO> list = commonlyUsedMapper.selectList(new LambdaQueryWrapper<CommonlyUsedDO>()
.eq(CommonlyUsedDO::getDeleted, 0).eq(CommonlyUsedDO::getUserId, userId).orderByAsc(CommonlyUsedDO::getSort));
Map<Long, CommonlyUsedDO> map = list.stream().collect(Collectors.toMap(CommonlyUsedDO::getId, a -> a));
List<CommonlyUsedRespVO> commonlyUsedRespVOS = new ArrayList<>();
Map<String, List<CommonlyUsedDO>> map = list.stream().collect(Collectors.groupingBy(a -> a.getType() + "_" + a.getObjectId()));
// -- 获取菜单列表
List<MenuDO> menuList = new ArrayList<>();
Set<Long> roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId());
if (CollectionUtil.isNotEmpty(roleIds)) {
Set<Long> menuIds = permissionService.getRoleMenuListByRoleId(roleIds);
if (CollectionUtil.isNotEmpty(menuIds)) {
menuList = menuService.getMenuList(menuIds);
menuList.removeIf(menu -> !CommonStatusEnum.ENABLE.getStatus().equals(menu.getStatus()));
}
}
List<MenuDO> menuList = menuService.getAvailableMenuListByRoleId();
// -- 获取流程列表
List<BpmModelRpcVO> modelList = bpmModelApi.getModelList().getCheckedData();
List<String> menuIds = new ArrayList<>();
List<String> processIds = new ArrayList<>();
if (!list.isEmpty()) {
@ -110,27 +104,59 @@ public class CommonlyUsedServiceImpl implements CommonlyUsedService {
if (CollectionUtil.isNotEmpty(myMenuList)) {
menuIds = myMenuList.stream().map(CommonlyUsedDO::getObjectId).collect(Collectors.toList());
}
// -- 将菜单列表转树形
}
List<CommonlyUsedRespVO> commonlyUsedRespVOS = new ArrayList<>();
for (MenuDO menuDO : menuList) {
menuDO.setSelectedFlag(false);
if (menuIds.contains(String.valueOf(menuDO.getId()))) {
menuDO.setSelectedFlag(true);
CommonlyUsedRespVO commonlyUsedRespVO = BeanUtils.toBean(menuDO, CommonlyUsedRespVO.class);
List<CommonlyUsedDO> menus = map.get("2" + "_" + menuDO.getId());
CommonlyUsedDO commonlyUsedDO = menus.get(0);
CommonlyUsedRespVO commonlyUsedRespVO = BeanUtil.copyProperties(commonlyUsedDO, CommonlyUsedRespVO.class);
commonlyUsedRespVO.setImg(menuDO.getIcon());
commonlyUsedRespVO.setName(menuDO.getName());
commonlyUsedRespVO.setRouting(menuDO.getPath());
commonlyUsedRespVOS.add(commonlyUsedRespVO);
}
}
// -- 获取流程列表
for (BpmModelRpcVO modelRpcVO : modelList) {
modelRpcVO.setSelectedFlag(false);
if (processIds.contains(String.valueOf(modelRpcVO.getId()))) {
modelRpcVO.setSelectedFlag(true);
List<CommonlyUsedDO> models = map.get("1" + "_" + modelRpcVO.getId());
CommonlyUsedDO commonlyUsedDO = models.get(0);
CommonlyUsedRespVO commonlyUsedRespVO = BeanUtils.toBean(commonlyUsedDO, CommonlyUsedRespVO.class);
commonlyUsedRespVO.setImg(modelRpcVO.getProcessImg());
commonlyUsedRespVO.setName(modelRpcVO.getName());
commonlyUsedRespVO.setRouting(modelRpcVO.getFormCustomCreatePath());
commonlyUsedRespVOS.add(commonlyUsedRespVO);
}
}
List<AuthPermissionInfoRespVO.MenuVO> menus = AuthConvert.INSTANCE.buildMenuTree(menuList);
vo.setMenus(menus);
vo.setCommonlyUsedRespVOS(commonlyUsedRespVOS);
vo.setModelList(modelList);
return vo;
}
// TODO: 2024/9/5 还差流程的实现
return null;
@Override
public void batchCreate(List<CommonlyUsedSaveReqVO> list) {
List<CommonlyUsedDO> saveList = BeanUtils.toBean(list, CommonlyUsedDO.class);
commonlyUsedMapper.insertBatch(saveList);
}
@Override
public void batchUpdate(List<CommonlyUsedSaveReqVO> list) {
List<CommonlyUsedDO> updateList = BeanUtils.toBean(list, CommonlyUsedDO.class);
commonlyUsedMapper.updateBatch(updateList);
}
@Override
public void batchDelete(List<Long> ids) {
commonlyUsedMapper.deleteBatchIds(ids);
}
}

View File

@ -104,14 +104,30 @@ public interface DeptService {
/**
* 获得 部门树
*
* @return 部门列表
*/
List<DeptDO> getDeptTree();
/**
* 获得指定部门信息
*
* @param factoryId 工厂编号
* @return 部门信息
*/
DeptDO getDeptByFactoryId(Long factoryId);
/**
* 获取所有工厂部门
*
* @return
*/
List<DeptDO> getFactoryDeptList();
/**
* 获取所有工厂部门
*
* @return
*/
List<DeptDO> getFactoryDeptList(Long factoryId);
}

View File

@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSaveReqV
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper;
import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.common.annotations.VisibleForTesting;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
@ -284,4 +285,17 @@ public class DeptServiceImpl implements DeptService {
return deptMapper.selectOne(DeptDO::getFactoryId, factoryId);
}
@Override
public List<DeptDO> getFactoryDeptList() {
return this.getFactoryDeptList(null);
}
@Override
public List<DeptDO> getFactoryDeptList(Long factoryId) {
return deptMapper.selectList(new LambdaQueryWrapper<DeptDO>()
.eq(factoryId != null, DeptDO::getFactoryId, factoryId)
.isNotNull(DeptDO::getFactoryId)
.eq(DeptDO::getStatus, CommonStatusEnum.ENABLE.getStatus()));
}
}

View File

@ -9,8 +9,6 @@ import java.util.List;
/**
* 菜单 Service 接口
*
*/
public interface MenuService {
@ -84,4 +82,10 @@ public interface MenuService {
*/
List<MenuDO> getMenuList(Collection<Long> ids);
/**
* 通过当前登陆用户的角色获得可用菜单列表
*
* @return
*/
List<MenuDO> getAvailableMenuListByRoleId();
}

View File

@ -1,6 +1,8 @@
package cn.iocoder.yudao.module.system.service.permission;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuSaveVO;
@ -18,18 +20,19 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO.ID_ROOT;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
/**
* 菜单 Service 实现
*
*/
@Service
@Slf4j
@ -133,6 +136,20 @@ public class MenuServiceImpl implements MenuService {
return menuMapper.selectBatchIds(ids);
}
@Override
public List<MenuDO> getAvailableMenuListByRoleId() {
List<MenuDO> menuList = new ArrayList<>();
Set<Long> roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId());
if (CollectionUtil.isNotEmpty(roleIds)) {
Set<Long> menuIds = permissionService.getRoleMenuListByRoleId(roleIds);
if (CollectionUtil.isNotEmpty(menuIds)) {
menuList = this.getMenuList(menuIds);
menuList.removeIf(menu -> !CommonStatusEnum.ENABLE.getStatus().equals(menu.getStatus()));
}
}
return menuList;
}
/**
* 校验父菜单是否合法
* <p>

View File

@ -141,7 +141,25 @@ public interface AdminUserService {
*/
PageResult<AdminUserDO> getUserPage(UserPageReqVO reqVO);
void gpsPosition();
/**
* gps用户全量更新
*/
void gpsFullUserUpdate();
/**
* 获取工厂用户列表
*
* @param factoryId
* @return
*/
List<AdminUserDO> getFactoryUsers(Long factoryId);
/**
* gps用户增量更新
*
* @param adminUserDO
*/
void gpsIncrementalSynchronizationOfUsers(AdminUserDO adminUserDO);
/**
* 获得工厂用户分页列表
@ -321,6 +339,7 @@ public interface AdminUserService {
/**
* 获取指令性质得用户列表
*
* @param userNature 用户性质
* @return 用户列表
*/

View File

@ -290,14 +290,32 @@ public class AdminUserServiceImpl implements AdminUserService {
}
@Override
public void gpsPosition() {
// TODO: 2024/9/2
Set<Long> deptCondition = getDeptCondition(130L);
public void gpsFullUserUpdate() {
// 查询出所有带工厂id的部门ids
List<DeptDO> deptList = deptService.getFactoryDeptList();
List<Long> deptCondition = deptList.stream().map(DeptDO::getId).collect(Collectors.toList());
List<AdminUserDO> adminUserDOS = userMapper.selectList(new LambdaQueryWrapper<AdminUserDO>()
.in(AdminUserDO::getDeptId, deptCondition));
for (AdminUserDO adminUserDO : adminUserDOS) {
JSONObject object = new JSONObject().set("name", adminUserDO.getNickname()).set("uniqueId", adminUserDO.getMobile());
this.gpsIncrementalSynchronizationOfUsers(adminUserDO);
}
}
@Override
public List<AdminUserDO> getFactoryUsers(Long factoryId) {
List<DeptDO> deptList = deptService.getFactoryDeptList(factoryId);
List<Long> deptCondition = deptList.stream().map(DeptDO::getId).collect(Collectors.toList());
return userMapper.selectList(new LambdaQueryWrapper<AdminUserDO>()
.in(AdminUserDO::getDeptId, deptCondition)
.eq(AdminUserDO::getUserType, 1)
.eq(AdminUserDO::getStatus, 0));
}
@Override
public void gpsIncrementalSynchronizationOfUsers(AdminUserDO adminUserDO) {
try {
JSONObject object = new JSONObject().set("name", adminUserDO.getNickname()).set("uniqueId", adminUserDO.getMobile());
// 请求的 URL
String url = "http://127.0.0.1:8082/api/devices";
// 发送 POST 请求
@ -313,9 +331,9 @@ public class AdminUserServiceImpl implements AdminUserService {
.body(JSONUtil.toJsonStr(object))
.timeout(20000) // 设置超时时间
.execute(); // 执行请求并获取响应
// 打印响应结果
System.out.println(response.body());
log.info(response.body());
} catch (Exception e) {
log.info("添加工厂用户到GPS系统中失败", e);
}
}

View File

@ -43,6 +43,8 @@ public class FactoryUserServiceImpl implements FactoryUserService{
@Resource
private AdminUserMapper userMapper;
@Resource
private AdminUserService adminUserService;
@Resource
private PasswordEncoder passwordEncoder;
@ -100,7 +102,8 @@ public class FactoryUserServiceImpl implements FactoryUserService{
usersExtDO.setDeptId(deptDO.getId());
usersExtDO.setAttendanceMachineNos(convertList(attendanceMachineDOS, AttendanceMachineDO::getDeviceNo));
usersExtService.createUsers(usersExtDO);
// 工厂用户添加到GPS定位系统中
adminUserService.gpsIncrementalSynchronizationOfUsers(user);
try {
for (AttendanceMachineDO machineDO : attendanceMachineDOS) {

View File

@ -146,8 +146,8 @@ public class FactoryScreenDataController {
@GetMapping("/getDataOverview")
@Operation(summary = "获取大屏数据总览")
@PermitAll
public CommonResult<DataOverviewVO> getDataOverview() {
DataOverviewVO data = screenDataService.getDataOverview();
public CommonResult<DataOverviewVO> getDataOverview(@RequestParam(required = false) Long factoryId) {
DataOverviewVO data = screenDataService.getDataOverview(factoryId);
return success(data);
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Data
public class AssetsStockVO {
@Schema(description = "工厂id")
private Long factoryId;
@Schema(description = "工厂名称")
private String factoryName;
@Schema(description = "库存")
private Integer stock;
}

View File

@ -1,8 +1,12 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryforklift.FactoryForkliftDO;
import cn.iocoder.yudao.module.system.api.user.vo.AdminUserRpcVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
* 功能描述
*
@ -14,20 +18,47 @@ import lombok.Data;
public class DataOverviewVO {
@Schema(description = "员工数量")
private Integer total;
@Schema(description = "男员工")
private Integer maleTotal;
@Schema(description = "女员工")
private Integer femaleTotal;
@Schema(description = "员工列表")
private List<AdminUserRpcVO> users;
@Schema(description = "窑炉数量")
private Integer ylNum;
@Schema(description = "叉车台数")
private Integer forkliftTotal;
@Schema(description = "叉车运行数量")
private Integer truckOnNum;
@Schema(description = "叉车未运行数量")
private Integer truckOffNum;
@Schema(description = "窑炉信息列表")
private List<FactoryKilnVO> factoryKilnList;
@Schema(description = "打包线数量")
private Integer dbxNum;
@Schema(description = "打包线信息")
private List<FactoryPackingLineVO> FactoryPackingLineList;
@Schema(description = "叉车台数")
private Integer forkliftTotal;
@Schema(description = "叉车信息")
private List<ForkliftVO> forkliftList;
@Schema(description = "工厂叉车列表")
private List<FactoryForkliftDO> factoryForkliftList;
@Schema(description = "托盘数")
private Integer tpNum;
@Schema(description = "托盘信息")
private List<AssetsStockVO> trayList;
@Schema(description = "绑带数")
private Integer bdNum;
@Schema(description = "托盘信息")
private List<AssetsStockVO> strapsList;
@Schema(description = "出库")
private Integer outTotalNum;
@Schema(description = "入库")

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Data
public class FactoryKilnVO {
@Schema(description = "工厂id")
private Long factoryId;
@Schema(description = "工厂名称")
private String factoryName;
@Schema(description = "数量")
private Integer number;
@Schema(description = "产能")
private BigDecimal capacity;
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Data
public class FactoryPackingLineVO {
@Schema(description = "工厂id")
private Long factoryId;
@Schema(description = "工厂名称")
private String factoryName;
@Schema(description = "数量")
private Integer number;
}

View File

@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
/**
* 功能描述
*
* @author: yj
* @date: 2024年03月05日 13:55
*/
@Data
public class ForkliftVO {
@Schema(description = "工厂id")
private Long factoryId;
@Schema(description = "工厂名称")
private String factoryName;
@Schema(description = "总数量")
private Integer totalNum;
@Schema(description = "油车数量")
private Integer oilNum;
@Schema(description = "电车数量")
private Integer electricityNum;
}

View File

@ -1,17 +1,18 @@
package cn.iocoder.yudao.module.smartfactory.dal.mysql.factoryforklift;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factoryforklift.vo.FactoryForkliftPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factoryforklift.vo.FactoryForkliftRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryforklift.FactoryForkliftDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factoryforklift.vo.*;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 叉车管理 Mapper
*
@ -43,4 +44,13 @@ public interface FactoryForkliftMapper extends BaseMapperX<FactoryForkliftDO> {
* @return
*/
IPage<FactoryForkliftRespVO> getFactoryForkliftPage(@Param("vo") FactoryForkliftPageReqVO pageReqVO, @Param("page") Page<Object> objectPage);
/**
* 通过工厂ids 资产类型ids 获取叉车列表
*
* @param factoryIds
* @param typeIds
* @return
*/
List<FactoryForkliftRespVO> getFactoryForkliftByFactoryIdAndTypeIds(@Param("factoryIds") List<Long> factoryIds, @Param("typeIds") List<Long> typeIds);
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.smartfactory.dal.mysql.screendata;
import cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo.AssetsStockVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author 艾楷
*/
@Mapper
public interface ScreenDataMapper {
/**
* 根工厂ids和资产类型id获取工厂资产数量
*
* @param factoryIds
* @param typeIds
* @return
*/
List<AssetsStockVO> getAssetsNumByFactoryIdAndTypeIds(@Param("factoryIds") List<Long> factoryIds, @Param("typeIds") List<Long> typeIds);
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.smartfactory.service.factoryinfo;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@ -19,6 +20,7 @@ import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
import cn.iocoder.yudao.module.system.api.permission.dto.DeptDataPermissionRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -135,8 +137,8 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
@Override
public List<FactoryInfoDO> getFactoryList(Collection<Long> ids) {
return factoryInfoMapper.selectList(FactoryInfoDO::getId, ids);
return factoryInfoMapper.selectList(new LambdaQueryWrapper<FactoryInfoDO>()
.in(CollectionUtil.isNotEmpty(ids), FactoryInfoDO::getId, ids));
}
@Override

View File

@ -1,11 +1,13 @@
package cn.iocoder.yudao.module.smartfactory.service.factorykiln;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorykiln.vo.*;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorykiln.FactoryKilnDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorykiln.vo.FactoryKilnPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorykiln.vo.FactoryKilnRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorykiln.vo.FactoryKilnSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorykiln.FactoryKilnDO;
import javax.validation.Valid;
import java.util.List;
/**
* 工厂窑炉 Service 接口
@ -52,4 +54,11 @@ public interface FactoryKilnService {
*/
PageResult<FactoryKilnRespVO> getFactoryKilnPage(FactoryKilnPageReqVO pageReqVO);
/**
* 通过工厂id获取窑炉列表
*
* @param factoryId
* @return
*/
List<FactoryKilnDO> getFactoryKilnByFactoryId(Long factoryId);
}

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.smartfactory.service.factorykiln;
import cn.hutool.core.util.ArrayUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
@ -9,11 +8,13 @@ import cn.iocoder.yudao.module.smartfactory.controller.admin.factorykiln.vo.Fact
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorykiln.vo.FactoryKilnSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorykiln.FactoryKilnDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorykiln.FactoryKilnMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
/**
* 工厂窑炉 Service 实现类
@ -60,4 +61,9 @@ public class FactoryKilnServiceImpl implements FactoryKilnService {
return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
}
@Override
public List<FactoryKilnDO> getFactoryKilnByFactoryId(Long factoryId) {
return factoryKilnMapper.selectList(new LambdaQueryWrapper<FactoryKilnDO>().eq(factoryId != null, FactoryKilnDO::getFactoryId, factoryId));
}
}

View File

@ -1,11 +1,13 @@
package cn.iocoder.yudao.module.smartfactory.service.factorypackingline;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorypackingline.vo.*;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorypackingline.FactoryPackingLineDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorypackingline.vo.FactoryPackingLinePageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorypackingline.vo.FactoryPackingLineRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorypackingline.vo.FactoryPackingLineSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorypackingline.FactoryPackingLineDO;
import javax.validation.Valid;
import java.util.List;
/**
* 打包线配置 Service 接口
@ -52,4 +54,11 @@ public interface FactoryPackingLineService {
*/
PageResult<FactoryPackingLineRespVO> getFactoryPackingLinePage(FactoryPackingLinePageReqVO pageReqVO);
/**
* 通过工厂ids获取打包线列表
*
* @param factoryIds
* @return
*/
List<FactoryPackingLineDO> getFactoryPackingLineByFactoryId(List<Long> factoryIds);
}

View File

@ -1,19 +1,21 @@
package cn.iocoder.yudao.module.smartfactory.service.factorypackingline;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorykiln.vo.FactoryKilnRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorypackingline.vo.FactoryPackingLinePageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorypackingline.vo.FactoryPackingLineRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorypackingline.vo.FactoryPackingLineSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorypackingline.FactoryPackingLineDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorypackingline.FactoryPackingLineMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
/**
* 打包线配置 Service 实现类
@ -61,4 +63,10 @@ public class FactoryPackingLineServiceImpl implements FactoryPackingLineService
}
@Override
public List<FactoryPackingLineDO> getFactoryPackingLineByFactoryId(List<Long> factoryIds) {
return factoryPackingLineMapper.selectList(new LambdaQueryWrapper<FactoryPackingLineDO>()
.in(CollectionUtil.isNotEmpty(factoryIds), FactoryPackingLineDO::getFactoryId, factoryIds));
}
}

View File

@ -92,7 +92,7 @@ public interface ScreenDataService {
*
* @return
*/
DataOverviewVO getDataOverview();
DataOverviewVO getDataOverview(Long factoryId);
/**
* 获取大屏出入库

View File

@ -1,36 +1,49 @@
package cn.iocoder.yudao.module.smartfactory.service.screendata;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.Month;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.enums.AssetsTypeCodeEnum;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factoryforklift.vo.FactoryForkliftRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo.*;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.device.cameradevice.CameraDeviceDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydataoverview.FactoryDataOverviewDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryforklift.FactoryForkliftDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorykiln.FactoryKilnDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorypackingline.FactoryPackingLineDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.screenfactoryextra.ScreenFactoryExtraDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydataoverview.FactoryDataOverviewMapper;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factoryforklift.FactoryForkliftMapper;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.screendata.ScreenDataMapper;
import cn.iocoder.yudao.module.smartfactory.framework.util.HttpUtil;
import cn.iocoder.yudao.module.smartfactory.service.device.cameradevice.CameraDeviceService;
import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataService;
import cn.iocoder.yudao.module.smartfactory.service.factorydataoverview.FactoryDataOverviewService;
import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService;
import cn.iocoder.yudao.module.smartfactory.service.factorykiln.FactoryKilnService;
import cn.iocoder.yudao.module.smartfactory.service.factorypackingline.FactoryPackingLineService;
import cn.iocoder.yudao.module.smartfactory.service.hik.HikService;
import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService;
import cn.iocoder.yudao.module.smartfactory.service.screenfactoryextra.ScreenFactoryExtraService;
import cn.iocoder.yudao.module.smartfactory.service.staff.StaffService;
import cn.iocoder.yudao.module.system.api.assets.AssetsTypeApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.vo.AdminUserRpcVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jodd.util.StringUtil;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
@ -57,8 +70,6 @@ public class ScreenDataServiceImpl implements ScreenDataService {
@Resource
private FactoryDataService factoryDataService;
@Resource
private FactoryDataOverviewService factoryDataOverviewService;
@Resource
private FactoryDataOverviewMapper factoryDataOverviewMapper;
@Resource
@ -67,6 +78,19 @@ public class ScreenDataServiceImpl implements ScreenDataService {
@Resource
private HikService hikService;
@Resource
private AdminUserApi adminUserApi;
@Resource
private FactoryKilnService factoryKilnService;
@Resource
private FactoryPackingLineService factoryPackingLineService;
@Resource
private AssetsTypeApi assetsTypeApi;
@Resource
private FactoryForkliftMapper factoryForkliftMapper;
@Resource
private ScreenDataMapper screenDataMapper;
@Override
public List<ProvincesDataRespVO> getProvincesData(String code) {
return factoryInfoService.getProvincesData(code);
@ -257,20 +281,123 @@ public class ScreenDataServiceImpl implements ScreenDataService {
}
@Override
public DataOverviewVO getDataOverview() {
public DataOverviewVO getDataOverview(Long factoryId) {
DataOverviewVO vo = new DataOverviewVO();
List<ScreenFactoryExtraDO> extras = screenFactoryExtraService.list();
List<FactoryDataOverviewDO> list = factoryDataOverviewService.list();
// List<ScreenFactoryExtraDO> extras = screenFactoryExtraService.list();
// List<FactoryDataOverviewDO> list = factoryDataOverviewService.list();
//获取工厂列表
vo.setTotal(list.stream().mapToInt(FactoryDataOverviewDO::getWorkerNum).sum());
vo.setYlNum(extras.stream().mapToInt(ScreenFactoryExtraDO::getYlNum).sum());
vo.setForkliftTotal(list.stream().mapToInt(FactoryDataOverviewDO::getTruckTotalNum).sum());
vo.setTruckOnNum(extras.stream().mapToInt(ScreenFactoryExtraDO::getTruckOnNum).sum());
vo.setTruckOffNum(extras.stream().mapToInt(ScreenFactoryExtraDO::getTruckOffNum).sum());
vo.setDbxNum(list.stream().mapToInt(FactoryDataOverviewDO::getDbxNum).sum());
List<FactoryInfoDO> factoryList = factoryInfoService.getFactoryList(Collections.singletonList(factoryId));
Map<Long, FactoryInfoDO> factoryMap = factoryList.stream().collect(Collectors.toMap(FactoryInfoDO::getId, v -> v));
// ---------------------------------- 用户 ----------------------------------
// -- 通过工厂id获取部门列表 -> 再通过部门列表获取用户列表
List<AdminUserRpcVO> users = adminUserApi.getFactoryUsers(factoryId).getData();
vo.setTotal(users.size());
int femaleTotal = (int) users.stream().filter(a -> a.getSex() == 2).count();
vo.setFemaleTotal(femaleTotal);
vo.setMaleTotal(users.size() - femaleTotal);
vo.setUsers(users);
// ---------------------------------- 窑炉 ----------------------------------
List<FactoryKilnDO> factoryKilnDOS = factoryKilnService.getFactoryKilnByFactoryId(factoryId);
vo.setYlNum(factoryKilnDOS.size());
Map<Long, List<FactoryKilnDO>> factoryKilnMap = factoryKilnDOS.stream().collect(Collectors.groupingBy(FactoryKilnDO::getFactoryId));
List<FactoryKilnVO> factoryKilnList = new ArrayList<>();
for (Map.Entry<Long, List<FactoryKilnDO>> entry : factoryKilnMap.entrySet()) {
FactoryKilnVO factoryKilnVO = new FactoryKilnVO();
factoryKilnVO.setFactoryId(entry.getKey());
factoryKilnVO.setFactoryName(factoryMap.get(entry.getKey()) == null ? "未分配到工厂部门" : factoryMap.get(entry.getKey()).getName());
factoryKilnVO.setNumber(entry.getValue().size());
BigDecimal totalCapacity = entry.getValue().stream()
.filter(f -> f.getCapacity() != null)
.map(FactoryKilnDO::getCapacity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
factoryKilnVO.setCapacity(totalCapacity);
factoryKilnList.add(factoryKilnVO);
}
vo.setFactoryKilnList(factoryKilnList);
// ---------------------------------- 打包线 ----------------------------------
List<FactoryPackingLineDO> factoryPackingLineDOS = factoryPackingLineService.getFactoryPackingLineByFactoryId(Collections.singletonList(factoryId));
Map<Long, List<FactoryPackingLineDO>> factoryPackingLineMap = factoryPackingLineDOS.stream().collect(Collectors.groupingBy(FactoryPackingLineDO::getFactoryId));
vo.setDbxNum(factoryPackingLineDOS.size());
List<FactoryPackingLineVO> FactoryPackingLineList = new ArrayList<>();
for (Map.Entry<Long, List<FactoryPackingLineDO>> entry : factoryPackingLineMap.entrySet()) {
FactoryPackingLineVO factoryPackingLineVO = new FactoryPackingLineVO();
factoryPackingLineVO.setFactoryId(entry.getKey());
factoryPackingLineVO.setFactoryName(factoryMap.get(entry.getKey()).getName());
factoryPackingLineVO.setNumber(entry.getValue().size());
FactoryPackingLineList.add(factoryPackingLineVO);
}
vo.setFactoryPackingLineList(FactoryPackingLineList);
// ---------------------------------- 叉车 ----------------------------------
List<ForkliftVO> forkliftList = new ArrayList<>();
List<Long> forkliftOilTypeIds = assetsTypeApi.getAssetsTypeIdsByCode(AssetsTypeCodeEnum.FORKLIFT_OIL).getData();
List<Long> forkliftElectricityTypeIds = assetsTypeApi.getAssetsTypeIdsByCode(AssetsTypeCodeEnum.FORKLIFT_ELECTRICITY).getData();
List<FactoryForkliftRespVO> factoryForkliftOil = factoryForkliftMapper.getFactoryForkliftByFactoryIdAndTypeIds(Collections.singletonList(factoryId), forkliftOilTypeIds);
List<FactoryForkliftRespVO> forkliftElectricity = factoryForkliftMapper.getFactoryForkliftByFactoryIdAndTypeIds(Collections.singletonList(factoryId), forkliftElectricityTypeIds);
vo.setForkliftTotal(factoryForkliftOil.size() + forkliftElectricity.size());
// -- 插入未分配数量
List<FactoryForkliftRespVO> notAllocatedFactoryForkliftOil = factoryForkliftOil.stream().filter(a -> a.getFactoryId() == null).collect(Collectors.toList());
List<FactoryForkliftRespVO> notAllocatedForkliftElectricity = forkliftElectricity.stream().filter(a -> a.getFactoryId() == null).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(notAllocatedFactoryForkliftOil) || CollectionUtil.isNotEmpty(notAllocatedForkliftElectricity)) {
forkliftList.add(new ForkliftVO().setFactoryName("未分配")
.setTotalNum(notAllocatedFactoryForkliftOil.size() + notAllocatedForkliftElectricity.size())
.setOilNum(notAllocatedFactoryForkliftOil.size())
.setElectricityNum(notAllocatedForkliftElectricity.size()));
}
List<FactoryForkliftRespVO> allocatedFactoryForkliftOil = factoryForkliftOil.stream().filter(a -> a.getFactoryId() != null).collect(Collectors.toList());
List<FactoryForkliftRespVO> allocatedForkliftElectricity = forkliftElectricity.stream().filter(a -> a.getFactoryId() != null).collect(Collectors.toList());
Map<Long, List<FactoryForkliftRespVO>> allocatedFactoryForkliftOilMap = allocatedFactoryForkliftOil.stream().collect(Collectors.groupingBy(FactoryForkliftRespVO::getFactoryId));
Map<Long, List<FactoryForkliftRespVO>> allocatedForkliftElectricityMap = allocatedForkliftElectricity.stream().collect(Collectors.groupingBy(FactoryForkliftRespVO::getFactoryId));
List<Long> allocatedFactoryForkliftOilFactoryIdIds = allocatedFactoryForkliftOil.stream().map(FactoryForkliftRespVO::getFactoryId).collect(Collectors.toList());
List<Long> allocatedForkliftElectricityFactoryIdIds = allocatedForkliftElectricity.stream().map(FactoryForkliftRespVO::getFactoryId).collect(Collectors.toList());
Set<Long> mergeFactoryIdIds = CollectionUtil.unionDistinct(allocatedFactoryForkliftOilFactoryIdIds, allocatedForkliftElectricityFactoryIdIds);
for (Long mergeFactoryIdId : mergeFactoryIdIds) {
FactoryInfoDO factoryInfoDO = factoryMap.get(mergeFactoryIdId);
if (factoryInfoDO != null) {
List<FactoryForkliftRespVO> allocatedFactoryForkliftOilItems = allocatedFactoryForkliftOilMap.get(mergeFactoryIdId);
List<FactoryForkliftRespVO> allocatedForkliftElectricityItems = allocatedForkliftElectricityMap.get(mergeFactoryIdId);
Integer oilNum = CollectionUtil.isNotEmpty(allocatedFactoryForkliftOilItems) ? allocatedFactoryForkliftOilItems.size() : 0;
Integer electricityNum = CollectionUtil.isNotEmpty(allocatedForkliftElectricityItems) ? allocatedForkliftElectricityItems.size() : 0;
forkliftList.add(new ForkliftVO().setFactoryName(factoryInfoDO.getName())
.setTotalNum(oilNum + electricityNum)
.setOilNum(oilNum)
.setElectricityNum(electricityNum));
}
}
vo.setForkliftList(forkliftList);
// -- 工厂叉车列表
List<FactoryForkliftDO> factoryForkliftDOS = new ArrayList<>();
if (factoryId != null) {
factoryForkliftDOS = factoryForkliftMapper.selectList(new LambdaQueryWrapper<FactoryForkliftDO>().eq(FactoryForkliftDO::getFactoryId, factoryId));
}
vo.setFactoryForkliftList(factoryForkliftDOS);
// ---------------------------------- 托盘 ----------------------------------
List<Long> trayAssetsTypeIds = assetsTypeApi.getAssetsTypeIdsByCode(AssetsTypeCodeEnum.TRAY).getData();
List<AssetsStockVO> trayList = screenDataMapper.getAssetsNumByFactoryIdAndTypeIds(Collections.singletonList(factoryId), trayAssetsTypeIds);
vo.setTpNum(trayList.stream().mapToInt(AssetsStockVO::getStock).sum());
vo.setTrayList(trayList);
// ---------------------------------- 托盘 ----------------------------------
List<Long> strapsAssetsTypeIds = assetsTypeApi.getAssetsTypeIdsByCode(AssetsTypeCodeEnum.STRAPS).getData();
List<AssetsStockVO> strapsList = screenDataMapper.getAssetsNumByFactoryIdAndTypeIds(Collections.singletonList(factoryId), strapsAssetsTypeIds);
vo.setBdNum(strapsList.stream().mapToInt(AssetsStockVO::getStock).sum());
vo.setStrapsList(strapsList);
//
// vo.setForkliftTotal(list.stream().mapToInt(FactoryDataOverviewDO::getTruckTotalNum).sum());
// vo.setTruckOnNum(extras.stream().mapToInt(ScreenFactoryExtraDO::getTruckOnNum).sum());
// vo.setTruckOffNum(extras.stream().mapToInt(ScreenFactoryExtraDO::getTruckOffNum).sum());
//
// vo.setTpNum(list.stream().mapToInt(FactoryDataOverviewDO::getTpNum).sum());
// vo.setBdNum(list.stream().mapToInt(FactoryDataOverviewDO::getBdNum).sum());
vo.setTpNum(list.stream().mapToInt(FactoryDataOverviewDO::getTpNum).sum());
vo.setBdNum(list.stream().mapToInt(FactoryDataOverviewDO::getBdNum).sum());
List<FactoryDataDO> factoryDataDOS = factoryDataService.getTodayInboundAndOutboundOverview(null);
Integer outTotalNum = factoryDataDOS.stream().filter(a -> a.getDataType() == 1).mapToInt(FactoryDataDO::getTotalNum).sum();

View File

@ -54,4 +54,33 @@
</if>
</where>
</select>
<select id="getFactoryForkliftByFactoryIdAndTypeIds"
resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.factoryforklift.vo.FactoryForkliftRespVO">
SELECT
a.id,
a.type_id,
a.assets_no AS assetsNo,
d.id AS factoryId,
d.NAME AS factoryName,
c.id AS forkliftId,
c.*
FROM
zc_assets AS a
LEFT JOIN sf_factory_forklift AS c ON a.assets_no = c.assets_no
LEFT JOIN sf_factory_info AS d ON c.factory_id = d.id
<where>
<if test="factoryIds != null and factoryIds.size() > 0">
and c.factory_id in
<foreach collection="factoryIds" open="(" item="factoryId" separator="," close=")">
#{factoryId}
</foreach>
</if>
<if test="typeIds != null and typeIds.size() > 0">
and a.type_id in
<foreach collection="typeIds" open="(" item="typeId" separator="," close=")">
#{typeId}
</foreach>
</if>
</where>
</select>
</mapper>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.smartfactory.dal.mysql.screendata.ScreenDataMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="getAssetsNumByFactoryIdAndTypeIds"
resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo.AssetsStockVO">
SELECT dept.factory_id AS factoryId,
ifnull(d.name,'未分配') as factoryName,
sum(b.stock) as stock
FROM zc_assets AS a
LEFT JOIN zc_dept_assets AS b ON a.id = b.assets_id
LEFT JOIN system_dept AS dept ON dept.id = b.dept_id
LEFT JOIN sf_factory_forklift AS c ON a.assets_no = c.assets_no
LEFT JOIN sf_factory_info AS d ON dept.factory_id = d.id
<where>
b.deleted = 0
and b.stock > 0
<if test="factoryIds != null and factoryIds.size() > 0">
and d.id in
<foreach collection="factoryIds" open="(" item="factoryId" separator="," close=")">
#{factoryId}
</foreach>
</if>
<if test="typeIds != null and typeIds.size() > 0">
and a.type_id in
<foreach collection="typeIds" open="(" item="typeId" separator="," close=")">
#{typeId}
</foreach>
</if>
</where>
GROUP BY dept.factory_id
</select>
</mapper>