获取原材盘点单接口
接口说明
接口地址:
- 获取盘点单数据接口: /gys/inspection-api-service/inventory/getInventoryList?projectId=347225275721728&beginTimestamp=20200615183500000
请求方式: GET
请求参数: projectId、beginTimestamp
重点说明:
- 时间过滤条件是数据库每条记录的时间戳,不是应用报告的生成时间。
- 每次查询默认查出满足条件的前20条原材盘点期次数据,如果第21条及之后的数据的时间戳与第20条相同,则一同查出,返回的期次数据中包含每个期次下多个原材的盘点数据;
- 取下一页数据时需要将上一次请求返回的数据中的maxTimestamp的值给下一次请求链接中的beginTimestamp。
- 数据不包含开始时间但包含结束时间。
- 如果某个期次只添加了期次信息而没有添加对应的原材信息,则该期次不会返回.
- 期次下的原材记录的增删改操作都会刷新时间戳,每次查询包含新增及修改过的期次及原材数据
- 返回数据中,每个期次数据下的原材数据都是全量返回
- 项目层会包含库房信息,拌合站层查询不包含库房信息
- 当传递id为项目层id,或使用项目层授权证且项目id不传递时,会查询项目层及项目下搅拌站数据
最佳实践
由于云端数据量较大,三方系统在通过接口请求数据时,我们建议项目ID(projectId)尽量传值,以项目为单位去请求数据。项目ID获取方式详见“获取集成项目接口协议”。
请求参数属性说明
参数名称 | 类型 | 必须 | 取值范围 | 默认值 | 描述 |
---|---|---|---|---|---|
projectId | Long | N | 项目ID,可为空;若使用租户层授权文件时,projectId为空查询全部项目数据,不为空时只查询对应项目的数据;若使用项目层授权文件时,为空则查询授权文件所属项目及下属拌合站的数据;不为空时只查询对应项目的数据;此项目ID获取方式详见获取集成项目 | ||
beginTimestamp | String | Y | 开始时间, 字符串,时间包含毫秒,格式为yyyyMMddHHmmssSSS, 不能为空,如 20160319101010000,2016年3月19号10点10分10秒000毫秒 |
返回结果格式
{
"data": {
"inventoryCheckInfoVos": [ //返回的期次数据集合
{
"endTime": "2020-04-25 10:00:00", //期次结束时间
"id": 378046118256640, //期次主键
"inventoryDate": 202004, //期次标识
"materials": [ //期次下包含的原材数据
{
"id": 378046118285312, //原材数据主键
"inventoryId": 378046118256640, //所属期次id
"materialCode": "S11.001", //材料编码
"materialId": 2494341, //材料id
"materialName": "普通混凝土", //材料名称
"materialUnitId": "4495347", //第三方材料id
"realQuantity": 0, //盘库数量
"spec": "", //材料规格
"texture": "", //材料材质
"unit": "立方米" //材料单位
}
],
"mixProjectId": 1459383, //所属搅拌站id
"mixProjectName": "花香四季一期_2#搅拌站", //所属搅拌站名称
"projectId": 1456353, //搅拌站上级项目id
"projectName": "花香四季一期", //搅拌站上级项目名称
"rowTimestamp": 1589516832000 //时间戳
},
{
"endTime": "2020-06-25 10:00:00",
"id": 387695113093120,
"inventoryDate": 202006,
"materials": [
{
"id": 387695113138176,
"inventoryId": 387695113093120,
"materialCode": "I111.01.01.014",
"materialId": 1562959,
"materialName": "普通硅酸盐水泥",
"materialUnitId": "4495347",
"realQuantity": 0,
"spec": "P.O32.5R",
"texture": "",
"unit": "吨",
"warehouseId": 15252333, //库房名称(项目层数据包含库房信息)
"warehouseUnitId": "4495347", //第三方库房id(项目层数据包含库房信息)
"warehouseName": "库房名称" //库房名称(项目层数据包含库房信息)
}
],
"projectId": 1456353, //项目id
"projectName": "花香四季一期", //项目名称
"rowTimestamp": 1591872526000
}
],
"maxTimestamp": "20200511190500000"
},
"errMsg": "",
"success": true
}
Java代码示例
//1、请求的controller
public class InventoryController {
@Autowired
private InventoryCheckClient inventoryCheckClient;
@Autowired
private OrgClient orgClient;
@Autowired
private ProjectClient projectClient;
@Autowired
private MaterialFeignClient materialClient;
@Autowired
private WarehouseClient warehouseClient;
/**
* 增量获取原材盘点单
*
* @param projectId 项目id
* @param beginTimestamp 开始时间
* @return
* @throws Exception
*/
@ResponseBody
@GetMapping(value = "/getInventoryList")
public ResultBaseVo<InventoryListInfoVo> getInventoryList(@RequestParam(value = "projectId", required = false) Long projectId,
@RequestParam("beginTimestamp") String beginTimestamp) throws Exception {
ResultBaseVo<InventoryListInfoVo> resultBaseVo = new ResultBaseVo<>();
//校验时间格式
if (!verifyBeginTime(beginTimestamp)) {
resultBaseVo.setSuccess(Boolean.FALSE);
resultBaseVo.setErrMsg("开始时间戳格式不正确");
sendInventoryErrMsg(traceInfo, "开始时间戳格式不正确");
return resultBaseVo;
}
try {
resultBaseVo = queryInventoryList(projectId, beginTimestamp, traceInfo);
} catch (Exception e) {
sendErrorMsg(traceInfo, e, "查询原材盘点单失败");
throw e;
}
List<String> searchKey = new ArrayList<>();
for (Object inventoryInfo : resultBaseVo.getData().getInventoryCheckInfoVos()) {
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(inventoryInfo));
searchKey.add("ID:" + jsonObject.getString("id"));
searchKey.add("PROJECT_ID:" + jsonObject.getString("projectId"));
searchKey.add("DATE_NO:" + jsonObject.getString("dateNo"));
}
traceInfo.setSearchKey(searchKey);
DownLogTracer.sendEndMsg(traceInfo, resultBaseVo);
return resultBaseVo;
}
/**
* 增量获取用料申请单
*
* @param projectId 项目id
* @param beginTimestamp 开始时间
* @return
* @throws Exception
*/
private ResultBaseVo<InventoryListInfoVo> queryInventoryList(Long projectId, String beginTimestamp, TraceInfo traceInfo) throws Exception {
ResultBaseVo<InventoryListInfoVo> resultVo = new ResultBaseVo<>();
List<InventoryIntegrationInfoVo> infoVos;
Map<Long, ProjectVo> projectIdAndVoMap;
String maxTimestamp = beginTimestamp;
try {
projectIdAndVoMap = getProjectMap(projectId, traceInfo, resultVo);
if (projectIdAndVoMap == null) {
return resultVo;
}
//根据开始时间及项目id查询对应原材盘点期次及材料
ResultBaseVo<List<InventoryCheckInfoVo>> infoVosResult = inventoryCheckClient
.queryInventoryAndMaterial(new ArrayList<>(projectIdAndVoMap.keySet()), beginTimestamp);
if (!infoVosResult.isSuccess()) {
resultVo.setSuccess(Boolean.FALSE);
resultVo.setErrMsg("查询原材盘点单失败");
sendInventoryErrMsg(traceInfo, "查询原材盘点单失败");
return resultVo;
}
DateFormat maxTimeFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
Date maxDate = maxTimeFormat.parse(maxTimestamp);
infoVos = buildDataInfos(projectIdAndVoMap, infoVosResult.getData(), maxDate);
maxTimestamp = maxTimeFormat.format(maxDate);
} catch (BizException e1) {
log.error("获取单据信息失败!", e1);
resultVo.setErrMsg("获取单据信息失败!" + e1.getMessage());
resultVo.setSuccess(Boolean.FALSE);
sendErrorMsg(traceInfo, e1, "查询收料磅单异常");
return resultVo;
}
InventoryListInfoVo billListInfoVo = new InventoryListInfoVo();
billListInfoVo.setMaxTimestamp(maxTimestamp);
billListInfoVo.setInventoryCheckInfoVos(infoVos);
resultVo.setSuccess(Boolean.TRUE);
resultVo.setData(billListInfoVo);
return resultVo;
}
/**
* 校验时间格式是否正确
*
* @param beginTimestamp
* @return
*/
private boolean verifyBeginTime(String beginTimestamp) {
SimpleDateFormat beginDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
try {
beginDateFormat.parse(beginTimestamp);
} catch (Exception ex) {
log.error("标准接口获取失败,type:{},tenantId:{},projectId:{},beginTimestamp:{}", MicroServiceContext.getCurrentContext().getTenantId(), MicroServiceContext.getCurrentContext().getProjectId(), beginTimestamp);
return false;
}
return true;
}
//2、业务层
public class DJBillIntegrateBiz {
private static final Long MaxLimit = 3000L;
@Autowired
DJBillIntegrateMapper djBillIntegrateMapper;
/**
* 根据时间及项目id增量查询原材盘点单期次及材料
*
* @param beginTimestamp
* @param projectIds
* @return
*/
@GetMapping(path = "/queryInventoryAndMaterial")
public ResultBaseVo<List<InventoryCheckInfoVo>> queryInventoryAndMaterial(@RequestParam("projectIds") List<Long> projectIds,
@RequestParam("beginTimestamp") String beginTimestamp) {
ResultBaseVo<List<InventoryCheckInfoVo>> baseVo = new ResultBaseVo<>();
try {
//查询原材盘点期次及材料信息
List<InventoryCheckInfoVo> inventoryCheckInfos = inventoryCheckBiz.queryInventoryAndMaterial(projectIds, beginTimestamp);
baseVo.setData(inventoryCheckInfos);
} catch (Exception e) {
log.error("查询原材盘点期次及材料异常!", e);
baseVo.setSuccess(Boolean.FALSE);
baseVo.setErrMsg("查询原材盘点期次及材料异常!" + e.getMessage());
}
return baseVo;
}
}
// 3、mapper层
public interface InventoryCheckMapper {
/**
* 获取列表最大时间
*
* @param projectIds
* @param beginTimestamp
* @return
*/
Date getInventoryMaxTime(@Param("projectIds") List<Long> projectIds,
@Param("beginTimestamp") String beginTimestamp);
/**
* 根据项目id,开始结束时间增量查询对应原材盘点期次信息
*
* @param projectIds
* @param beginTimestamp
* @param endTimestamp
* @return
*/
List<InventoryCheckInfoVo> queryInventoryCheckInfos(@Param("projectIds") List<Long> projectIds,
@Param("beginTimestamp") String beginTimestamp,
@Param("endTimestamp") String endTimestamp);
/**
* 根据inventoryIds 查询对应盘点期次材料信息
*
* @param inventoryIds
* @return
*/
List<InventoryMaterialInfoVo> queryMaterialListByInventoryIds(@Param("inventoryIds") List<Long> inventoryIds);
}
//4、mapper对应的xml文件
DJBillIntegrateMapper.ibm.xml
<?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="com.glodon.gys.inspection.mapper.inventory.InventoryCheckMapper">
<!--根据细表id获取细表信息-->
<select id="getInventoryMaxTime" resultType="java.util.Date">
select Max(F_ROW_TIMESTAMP) from
(
SELECT F_ROW_TIMESTAMP
from t_inventory
where
<if test="projectIds!= null and projectIds.size > 0">
F_PROJECT_ID in
<foreach collection="projectIds" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="projectIds==null">
F_PROJECT_ID !=-1
</if>
AND
<![CDATA[ F_ROW_TIMESTAMP>#{beginTimestamp} ]]>
order by
F_ROW_TIMESTAMP ASC
limit 20
) a
</select>
<select id="queryInventoryCheckInfos" resultType="com.glodon.gys.inspection.model.inventory.InventoryCheckInfoVo">
SELECT
F_ID as id ,
F_PROJECT_ID as projectId,
F_YEAR as year,
F_MONTH as month,
F_DATE_NO as dateNo,
F_DATE as date,
F_START_TIME as startTime,
F_ROW_TIMESTAMP as rowTimestamp
FROM t_inventory
where
F_PROJECT_ID in
<foreach collection="projectIds" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
AND
<![CDATA[ F_ROW_TIMESTAMP>#{beginTimestamp} ]]>
AND
<![CDATA[ F_ROW_TIMESTAMP<=#{endTimestamp} ]]>
order by
F_ROW_TIMESTAMP ASC
</select>
<select id="queryMaterialListByInventoryIds"
resultType="com.glodon.gys.inspection.model.inventory.InventoryMaterialInfoVo">
SELECT
F_ID AS id,
F_INVENTORY_ID AS inventoryId,
F_MATERIAL_ID AS materialId,
F_MATERIAL_CODE AS materialCode,
F_UNIT AS unit,
F_MATERIAL_NAME AS materialName,
F_SPEC AS spec,
F_TEXTURE AS texture,
F_WAREHOUSE_ID AS warehouseId,
F_WAREHOUSE_NAME AS warehouseName
FROM
T_INVENTORY_MATERIAL
WHERE
F_INVENTORY_ID in
<foreach collection="inventoryIds" item="inventoryId" index="index" open="(" close=")" separator=",">
#{inventoryId}
</foreach>
</select>
</mapper>
```