controller:
**
* 批量計算
* @param orderdid
* @return
*/
@ResponseBody
@RequestMapping(value = “updateAllTB”, method = RequestMethod.POST, produces=“text/html;charset=UTF-8”)
public String updateAllStatus(String orderdid, HttpServletRequest request,PageEntity pageEntity) {
ObjectNode json = new ObjectMapper().createObjectNode();
try {
//执行批量计算方法
String[] msg=proSprocessService.updateAllTB(orderdid);
if((“1”).equals(msg[0]) ){
json.put(“info”, “计算成功!”);
json.put(“status”, “y”);
}else{
json.put(“info”, “计算失败!原因:”+msg[1]);
json.put(“status”, “n”);
}
} catch (Exception e) {
json.put("info", e.getMessage());
json.put("status", "n");
e.printStackTrace();
log.error("error", e);
}
return json.toString();
}
service:
//批量计算计划完工时间
public String[] updateAllTB(String ids){
Map<String, Object> map = new HashMap<String, Object>();
map.put("orderdids", ids);
map.put("status", null);
map.put("message", null);
pullSchedulDao.CalculationDate(map);
Integer status = (Integer)map.get("status");
String message = (String)map.get("message");
return new String[]{status.toString(),message};
}
dao:
/**
* 计算工序计划完工时间存储过程调用
* @param map
* @return
*/
Map<String, Object> CalculationDate(Map<String, Object> map);
xml:
<!-- 计算工序计划完工时间 -->
<select id="CalculationDate" parameterType="java.util.Map" statementType="CALLABLE">
{call Calculation_date(
#{orderdids, mode=IN, jdbcType=VARCHAR},
#{status, mode=OUT, jdbcType=INTEGER},
#{message, mode=OUT, jdbcType=VARCHAR}
)}
</select>
oracle:
CREATE OR REPLACE
PROCEDURE Calculation_date(orderdids in varchar2,status out Integer,message out varchar2) IS
CURSOR return_list IS --声明显式游标
SELECT
a.id id,
a.orderdid orderdid,
A .sortpostion sortpostion,
A .nextprocessno nextprocessno,
b.sprocessname sprocessname,
sa.publicationdate publicationdate,
ma.transportation_date transportation_date,
pa.packvertime packvertime,
a.planfinishdate planfinishdate,
b.maketime maketime,
b.issoft issoft
FROM
hsjg_tb_prosprocess A
LEFT JOIN HSJG_TB_NORMAL_STANPROCESS b ON A .SPROCESSID = b. ID
LEFT JOIN HSJG_TB_SALEORDER sa ON sa. ID = A .orderid
LEFT JOIN HSJG_TB_NORMAL_CLIENT_MAIN ma ON ma. ID = sa.mainid
left join HSJG_TB_NORMAL_PACKVER pa on 1=1
WHERE A .orderdid in (select * from table (strsplit(orderdids)))
ORDER BY A .nextprocessno DESC ;
CURSOR return_list2(did number) IS --声明显式游标
SELECT
a.id,
A .sortpostion sortpostion,
A .nextprocessno nextprocessno,
b.sprocessname sprocessname,
a.planfinishdate planfinishdate,
b.maketime maketime,
b.issoft issoft
FROM
hsjg_tb_prosprocess A
LEFT JOIN HSJG_TB_NORMAL_STANPROCESS b ON A .SPROCESSID = b. ID
WHERE A .orderdid = did
ORDER BY A .nextprocessno DESC ;
CURSOR find_planfinishdate(did number) IS --声明显式游标 (查询订单计划完工日期是否有值)
SELECT planstdate from hsjg_tb_saleorderd where id = did;
BEGIN
update hsjg_tb_prosprocess set PLANFINISHTZDATE = ‘’ where orderdid in (select * from table (strsplit(orderdids)));
for list_rows in return_list LOOP
if list_rows.nextprocessno is null then --最后一道工序
for planfinishdate_list in find_planfinishdate(list_rows.orderdid) loop
if planfinishdate_list.planstdate is null then --说明订单中没有计划完工时间
–计划完工时间 = 交版时间 - 运输提前期 - 包版时间
update hsjg_tb_prosprocess set planfinishdate = list_rows.publicationdate - 1/24list_rows.transportation_date - 1/24list_rows.packvertime where id = list_rows.id;
else --说明订单中有计划完工时间或者计划完工时间备修改过这时最后一道工序的完工时间就是修改过的时间
update hsjg_tb_prosprocess set planfinishdate = planfinishdate_list.planstdate;
end if;
end loop;
else
for list_rows2 in return_list2(list_rows.orderdid) LOOP
if list_rows2.sortpostion = list_rows.nextprocessno then --如果不是最后一道工序那么就去游标中找他的下一道工序
–使用下一道工序的完工时间+做工时间就是这道工序的完工时间
update hsjg_tb_prosprocess set planfinishdate = list_rows2.planfinishdate-1/24/60*list_rows2.maketime where id = list_rows.id;
EXIT;
end if;
end LOOP;
end if;
END LOOP;
status := 1;
message := ‘计算计划完工时间存储过程执行成功’;
DBMS_OUTPUT.PUT_LINE(message);
COMMIT;
Exception
When others then
status := -1;
message := ‘计算计划完工时间存储过程异常’;
DBMS_OUTPUT.PUT_LINE(message);
Rollback;
END Calculation_date;