rsf-open-api/src/main/java/com/vincent/rsf/openApi/config/WebMvcConfig.java
New file @@ -0,0 +1,78 @@ package com.vincent.rsf.openApi.config; import com.vincent.rsf.openApi.entity.constant.Constants; import com.vincent.rsf.openApi.utils.Http; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.AsyncHandlerInterceptor; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * WebMvc配置, 拦截器、资源映射等都在此配置 * * @author vincent * @since 2019-06-12 10:11:16 */ @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(getAsyncHandlerInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/swagger-resources/**", "/webjars/**","/erp/**", "/v2/**","/v3/**","/doc.html/**", "/swagger-ui.html/**"); } @Bean public AsyncHandlerInterceptor getAsyncHandlerInterceptor() { return new AsyncHandlerInterceptor(){ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Http.cors(response); return true; } }; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("doc.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowedHeaders("*") .exposedHeaders(Constants.TOKEN_HEADER_NAME) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH") .allowCredentials(true) .maxAge(3600); } public static void cors(HttpServletResponse response){ // 跨域设置 response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Allow-Headers", "*"); response.setHeader("Access-Control-Expose-Headers", Constants.TOKEN_HEADER_NAME); } } rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/MonitorController.java
New file @@ -0,0 +1,34 @@ package com.vincent.rsf.openApi.controller; import com.vincent.rsf.openApi.entity.dto.CommonResponse; import com.vincent.rsf.openApi.service.MonitorService; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Map; /** * 大屏 */ @RestController @RequestMapping("/monitor") public class MonitorController { @Autowired private MonitorService monitorService; /** * 获取出入库流水记录 * @return */ @PostMapping("/inOut/page") @ApiOperation("获取入出库流水记录") public CommonResponse getInOutHis(@RequestBody Map<String, Object> param) { return monitorService.getInOutHistories(param); } } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/Constants.java
New file @@ -0,0 +1,134 @@ package com.vincent.rsf.openApi.entity.constant; /** * 系统常量 * Created by vincent on 2019-10-29 15:55 */ public class Constants { /** * 默认成功码 */ public static final int RESULT_OK_CODE = 0; /** * 默认失败码 */ public static final int RESULT_ERROR_CODE = 1; /** * 默认成功信息 */ public static final String RESULT_OK_MSG = "Request success"; /** * 默认失败信息 */ public static final String RESULT_ERROR_MSG = "Internal server error!"; /** * 无权限错误码 */ public static final int UNAUTHORIZED_CODE = 403; /** * 无权限提示信息 */ public static final String UNAUTHORIZED_MSG = "No access right"; /** * 未认证错误码 */ public static final int UNAUTHENTICATED_CODE = 401; /** * 未认证提示信息 */ public static final String UNAUTHENTICATED_MSG = "Please log in first"; /** * 登录过期错误码 */ public static final int TOKEN_EXPIRED_CODE = 401; /** * 登录过期提示信息 */ public static final String TOKEN_EXPIRED_MSG = "Login expired"; /** * 非法token错误码 */ public static final int BAD_CREDENTIALS_CODE = 401; /** * 非法token提示信息 */ public static final String BAD_CREDENTIALS_MSG = "Please log out and log in again"; /** * 表示升序的值 */ public static final String ORDER_ASC_VALUE = "asc"; /** * 表示降序的值 */ public static final String ORDER_DESC_VALUE = "desc"; /** * token通过header传递的名称 */ public static final String TOKEN_HEADER_NAME = "Authorization"; /** * token通过参数传递的名称 */ public static final String TOKEN_PARAM_NAME = "access_token"; /** * token认证类型 */ public static final String TOKEN_TYPE = "Bearer"; /** * 库存出库 */ public static final String TASK_TYPE_OUT_STOCK = "outStock"; /** * 库存盘点出库 */ public static final String TASK_TYPE_OUT_CHECK = "check"; /** * 单据出库 */ public static final String TASK_TYPE_ORDER_OUT_STOCK = "OrderOutStock"; /** * 波次出库 */ public static final String TASK_TYPE_WAVE_OUT_STOCK = "WaveOutStock"; /** * 拣料出库 */ public static final String TASK_TYPE_OUT_PICK = "pick"; /** * 排序默认值 */ public static final Integer TASK_SORT_DEFAULT_VALUE = 49; /** * 排序最大值 */ public static final Integer TASK_SORT_MAX_VALUE = 999; /** * 排序最小值 */ public static final Integer TASK_SORT_MIN_VALUE = 0; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java
@@ -7,10 +7,8 @@ public static String callBack = "/rsf-server/wcs/receive/ex/msg"; //订单信息查询 public static String QUERY_ORDER_AND_DETLS = "/rsf-server/erp/query/order"; //订单信息修改/添加 public static String MODIFY_ORDER_DETLS = "/rsf-server/order/sync/orders/update"; @@ -18,5 +16,8 @@ //删除单据信息 public static String ORDER_DEL = "/rsf-server/order/sync/orders/delete"; //获取出入库流水 public static String IN_OUT_HISTORIES = "/rsf-server/monitor/inOut/page"; } rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/MonitorService.java
New file @@ -0,0 +1,15 @@ package com.vincent.rsf.openApi.service; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.openApi.entity.dto.CommonResponse; import java.util.Map; public interface MonitorService { /** * 获取出入库历史 * @param param * @return */ CommonResponse getInOutHistories(Map<String, Object> param); } rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/MonitorServiceImpl.java
New file @@ -0,0 +1,71 @@ package com.vincent.rsf.openApi.service.impl; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.cfg.CoercionAction; import com.fasterxml.jackson.databind.cfg.CoercionInputShape; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.openApi.config.PlatformProperties; import com.vincent.rsf.openApi.entity.constant.WmsConstant; import com.vincent.rsf.openApi.entity.dto.CommonResponse; import com.vincent.rsf.openApi.service.MonitorService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.*; @Slf4j @Service public class MonitorServiceImpl implements MonitorService { @Autowired private PlatformProperties.WmsApi wmsApi; @Autowired private RestTemplate restTemplate; /** * 获取出入库历史 * @param params * @return */ @Override public CommonResponse getInOutHistories(Map<String, Object> params) { if (Objects.isNull(params)) { throw new CoolException("订单号不能为空!!"); } /**WMS基础配置链接*/ String wmsUrl = wmsApi.getHost() + ":" + wmsApi.getPort() + WmsConstant.IN_OUT_HISTORIES; log.info("修改订单信息及状态: {}, 请求参数: {}", wmsUrl, JSONObject.toJSONString(params)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity(params, headers); ResponseEntity<String> exchange = restTemplate.exchange(wmsUrl, HttpMethod.POST, httpEntity, String.class); log.info("订单修改返回结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { throw new CoolException("查询失败!!"); } else { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.coercionConfigDefaults().setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); try { CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); if (result.getCode() == 200) { return result; } else { throw new CoolException("查询失败!!"); } } catch (JsonProcessingException e) { throw new CoolException(e.getMessage()); } } } } rsf-open-api/src/main/java/com/vincent/rsf/openApi/utils/Http.java
New file @@ -0,0 +1,42 @@ package com.vincent.rsf.openApi.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.openApi.entity.constant.Constants; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; /** * Created by vincent on 2019-08-01 */ public class Http { public static void response(HttpServletResponse response, String baseRes){ response.setCharacterEncoding("utf-8"); response.setContentType("application/json; charset=utf-8"); try (PrintWriter out = response.getWriter()) { R r = R.parse(baseRes); JSONObject jsonObject = new JSONObject(); jsonObject.put("total", "0"); jsonObject.put("record", ""); r.add(jsonObject); out.print(JSON.toJSONString(r)); out.flush(); } catch (Exception e) { e.printStackTrace(); } } public static void cors(HttpServletResponse response){ // 跨域设置 response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Allow-Headers", "*"); response.setHeader("Access-Control-Expose-Headers", Constants.TOKEN_HEADER_NAME); } } rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/MonitorController.java
New file @@ -0,0 +1,85 @@ package com.vincent.rsf.server.api.controller.pda; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.api.service.MonitorService; import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.common.utils.FieldsUtils; import com.vincent.rsf.server.manager.controller.params.WarehouseStockParam; import com.vincent.rsf.server.manager.entity.ViewStockManage; import com.vincent.rsf.server.manager.enums.ViewStockType; import com.vincent.rsf.server.manager.service.WarehouseStockService; import com.vincent.rsf.server.system.controller.BaseController; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; import java.util.Objects; /** * 大屏 */ @RestController @RequestMapping("/monitor") public class MonitorController extends BaseController { @Autowired private MonitorService monitorService; @Autowired private WarehouseStockService warehouseStockService; /** * 获取出入库流水记录 * @return */ @PostMapping("/inOut/page") @ApiOperation("获取入出库流水记录") public R getInOutHis(@RequestBody Map<String, Object> param) { if (Objects.isNull(param)) { return R.error("参数不能为空!!"); } BaseParam baseParam = buildParam(param, BaseParam.class); PageParam<ViewStockManage, BaseParam> pageParam = new PageParam<>(baseParam, ViewStockManage.class); WarehouseStockParam stockParam = JSONObject.parseObject(JSONObject.toJSONString(param), WarehouseStockParam.class); String type = Objects.isNull(stockParam.getAggType()) ? ViewStockType.VIEW_STOCK_TYPE_MATNR.val : stockParam.getAggType(); ViewStockManage stock = stockParam.getStock(); QueryWrapper<ViewStockManage> wrapper = new QueryWrapper<>(); if (type.equals(ViewStockType.VIEW_STOCK_TYPE_SUPPLIER.val)) { wrapper.groupBy("splr_id"); } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_BATCH.val)) { wrapper.groupBy("batch"); } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_WAREHOUSE.val)) { wrapper.groupBy("warehouse"); } else if (type.equals(ViewStockType.VIEW_STOCK_TYPE_FIELDSINDEX.val)) { wrapper.groupBy("fields_index"); } else { wrapper.groupBy("matnr_id"); } FieldsUtils.setFieldsFilters(wrapper, pageParam, ViewStockManage.class); IPage<ViewStockManage> pageResult = warehouseStockService.pageByStock(pageParam, wrapper); List<ViewStockManage> records = pageResult.getRecords(); for (ViewStockManage record : records) { if (!Objects.isNull(record.getFieldsIndex())) { Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex()); record.setExtendFields(fields); } } pageResult.setRecords(records); return R.ok(pageResult); } } rsf-server/src/main/java/com/vincent/rsf/server/api/service/MonitorService.java
New file @@ -0,0 +1,10 @@ package com.vincent.rsf.server.api.service; import com.vincent.rsf.framework.common.R; import java.util.Map; public interface MonitorService { R getInOutHistories(Map<String, Object> param); } rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MonitorServiceImpl.java
New file @@ -0,0 +1,17 @@ package com.vincent.rsf.server.api.service.impl; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.api.service.MonitorService; import org.springframework.stereotype.Service; import java.util.Map; @Service public class MonitorServiceImpl implements MonitorService { @Override public R getInOutHistories(Map<String, Object> param) { return R.ok(); } } rsf-server/src/main/java/com/vincent/rsf/server/common/security/SecurityConfig.java
@@ -53,6 +53,7 @@ "/swagger-ui/**", "/ws/**", "/wcs/**", "/monitor/**", "/mcp/**" }; rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WarehouseStockController.java
@@ -11,7 +11,6 @@ import com.vincent.rsf.server.manager.controller.params.WarehouseStockParam; import com.vincent.rsf.server.manager.entity.StockItem; import com.vincent.rsf.server.manager.entity.ViewStockManage; import com.vincent.rsf.server.manager.entity.WarehouseAreasItem; import com.vincent.rsf.server.manager.enums.ViewStockType; import com.vincent.rsf.server.manager.service.WarehouseStockService; import com.vincent.rsf.server.system.controller.BaseController; @@ -36,8 +35,7 @@ @Autowired private WarehouseStockService warehouseStockService; @PreAuthorize("hasAuthority('manager:locItem:list')") // @PreAuthorize("hasAuthority('manager:locItem:list')") @PostMapping("/page") public R page(@RequestBody Map<String, Object> param) { if (Objects.isNull(param)) { rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -347,6 +347,17 @@ if (!this.save(task)) { throw new CoolException("任务保存失败!!"); } BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, deviceSite.getSite())); if (Objects.isNull(station) || station.getUseStatus() != LocStsType.LOC_STS_TYPE_O.type) { throw new CoolException("站点不存在或站点不处于空库状态!!"); } station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); if (basStationService.updateById(station)) { throw new CoolException("站点状态更新失败!!"); } if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()) .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type).set(Loc::getBarcode, pakin.getBarcode()))) { throw new CoolException("库位预约失败!!");