|
@@ -1,17 +1,22 @@
|
|
|
package com.iamberry.rst.controllers.approval;
|
|
|
|
|
|
+import com.auth0.jwt.internal.org.apache.commons.io.FileUtils;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.iamberry.rst.core.approval.*;
|
|
|
import com.iamberry.rst.core.page.PageRequest;
|
|
|
import com.iamberry.rst.core.page.PagedResult;
|
|
|
import com.iamberry.rst.core.sys.Admin;
|
|
|
+import com.iamberry.rst.faces.approval.ApplyPickService;
|
|
|
import com.iamberry.rst.faces.approval.ApprovalOrderService;
|
|
|
import com.iamberry.rst.faces.approval.ApprovalTaskService;
|
|
|
import com.iamberry.rst.faces.sys.SysService;
|
|
|
import com.iamberry.wechat.core.entity.WechatUtils;
|
|
|
+import com.iamberry.wechat.file.FileType;
|
|
|
import com.iamberry.wechat.tools.ResponseJson;
|
|
|
import com.iamberry.wechat.tools.ResultInfo;
|
|
|
+import com.iamberry.wechat.tools.SendMessageUtil;
|
|
|
+import com.iamberry.wechat.tools.StrUtils;
|
|
|
import net.sf.json.JSONArray;
|
|
|
import net.sf.json.JSONObject;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -22,6 +27,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
|
|
import org.springframework.web.context.ContextLoader;
|
|
|
import org.springframework.web.context.WebApplicationContext;
|
|
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
|
+import sun.misc.BASE64Decoder;
|
|
|
|
|
|
import javax.servlet.ServletContext;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
@@ -35,7 +41,7 @@ import java.util.*;
|
|
|
*/
|
|
|
|
|
|
@Controller
|
|
|
-@RequestMapping("/approval")
|
|
|
+@RequestMapping("/wechat/approval")
|
|
|
public class ApprovalController {
|
|
|
@Autowired
|
|
|
private ApprovalOrderService approvalOrderService;
|
|
@@ -43,6 +49,10 @@ public class ApprovalController {
|
|
|
private ApprovalTaskService approvalTaskService;
|
|
|
@Autowired
|
|
|
private SysService sysService;
|
|
|
+ @Autowired
|
|
|
+ private ApplyPickService applyPickService;
|
|
|
+ @SuppressWarnings("restriction")
|
|
|
+ private BASE64Decoder decoder = new BASE64Decoder();
|
|
|
/**
|
|
|
* 新增审批信息
|
|
|
* @param request
|
|
@@ -59,7 +69,7 @@ public class ApprovalController {
|
|
|
}
|
|
|
//获取openid,根据openid查询当前登录人信息
|
|
|
String openId = WechatUtils.getUserBySession(request).getUserOpenid();
|
|
|
- /*String openId = "oaH_GwObiozJFBypUg0wKJjQpBiU";*/
|
|
|
+ /*String openId = "oEy-_s5C7LwmLGTpEGfJoecfsYZc";*/
|
|
|
|
|
|
//获取审批任务id
|
|
|
Map<String, Object> taskinfo = approvalTaskService.salesmanSubmitApply(1);
|
|
@@ -97,7 +107,7 @@ public class ApprovalController {
|
|
|
JSONObject contract = jsonproductionContracts.getJSONObject(i);
|
|
|
ApprovalProductionContract contractInfo = new ApprovalProductionContract();
|
|
|
contractInfo.setContractUrl(contract.getString("contractUrl"));
|
|
|
- contractInfo.setContractName(contract.getString("contractName"));
|
|
|
+ contractInfo.setContractType(contract.getString("contractType"));
|
|
|
listProductionContract.add(contractInfo);
|
|
|
}
|
|
|
boolean returnValue = approvalOrderService.insertApprovalProduction(approvalProduction,listApprovalProductionItem,listProductionContract,taskinfo,openId);
|
|
@@ -148,7 +158,162 @@ public class ApprovalController {
|
|
|
return responseJson;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
+ /**
|
|
|
+ * base图片上传
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ @SuppressWarnings({ "deprecation", "restriction" })
|
|
|
+ @ResponseBody
|
|
|
+ @RequestMapping("/baseFileUpload")
|
|
|
+ public ResponseJson baseFileUpload(HttpServletRequest req) throws IOException{
|
|
|
+ ResponseJson responseJson = new ResponseJson();
|
|
|
+
|
|
|
+ //取到前台传过来的 base64图片 并创建要存放在项目中的路径
|
|
|
+ WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
|
|
|
+ ServletContext servletContext = webApplicationContext.getServletContext();
|
|
|
+ String imgFilePath = servletContext.getRealPath(ResultInfo.CONTRACT_IMAGE);
|
|
|
+ try {
|
|
|
+ isExitsPath(imgFilePath);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ //创建分享对象 并存入数据库
|
|
|
+ //String postParams = StrUtils.getPostParamsStr(req); //data:image/png;base64,iVBORw0
|
|
|
+ String postParams = req.getParameter("file");
|
|
|
+ String[] shareImgUrlArr = org.apache.commons.lang3.StringUtils.split(postParams, ",");
|
|
|
+ String imgUrl = "";
|
|
|
+ HashMap<String, String> map = new HashMap<String, String>();
|
|
|
+ if(shareImgUrlArr != null && shareImgUrlArr.length > 0){
|
|
|
+ // 防止内存溢出
|
|
|
+ String suffixName = new String (shareImgUrlArr[0].split(";")[0].split("/")[1]);
|
|
|
+ String shareImgUrl = new String (shareImgUrlArr[1]);
|
|
|
+
|
|
|
+ // 通过文件头判断后缀
|
|
|
+ byte [] b = new byte[28];
|
|
|
+ shareImgUrl.getBytes(0, 27, b, 0);
|
|
|
+ String temp = new String(b);
|
|
|
+ b = decoder.decodeBuffer(temp);
|
|
|
+
|
|
|
+ // 二进制转换文件头
|
|
|
+ String type = null;
|
|
|
+ String fileHead = byte2hex(b);
|
|
|
+ fileHead = fileHead.toUpperCase();
|
|
|
+
|
|
|
+ // 获取系统支持的文件类型,如果不支持,返回默认的图片
|
|
|
+ FileType[] fileTypes = FileType.values();
|
|
|
+ for (FileType fileType : fileTypes) {
|
|
|
+ if (fileHead.startsWith(fileType.getValue())) {
|
|
|
+ type = fileType.getSuffix();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (type == null) {
|
|
|
+ System.err.println("上传图片异常..." + fileHead);
|
|
|
+ } else {
|
|
|
+ String fileName = getFileName(suffixName, type);
|
|
|
+ boolean flag = generateImage(shareImgUrl, imgFilePath + "/" + fileName);
|
|
|
+ if(flag){
|
|
|
+ responseJson.setReturnCode(200);
|
|
|
+ responseJson.addResponseKeyValue("imgUrl",ResultInfo.CONTRACT_IMAGE+fileName);
|
|
|
+ }else{
|
|
|
+ responseJson.setReturnCode(500);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ responseJson.setReturnCode(500);
|
|
|
+ }
|
|
|
+
|
|
|
+ //返回值拼凑
|
|
|
+ /*String requurl = req.getContextPath();//获取web项目的路径*/
|
|
|
+
|
|
|
+ return responseJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断路径是否存在 不存在则创建
|
|
|
+ * create date 2016年6月1日
|
|
|
+ * @author 穆再兴
|
|
|
+ * @param path
|
|
|
+ * @return
|
|
|
+ * @throws InterruptedException
|
|
|
+ */
|
|
|
+ public boolean isExitsPath(String path)throws InterruptedException{
|
|
|
+ String [] paths=path.split("/");
|
|
|
+ StringBuilder fullPath=new StringBuilder();
|
|
|
+ for (int i = 0; i < paths.length; i++) {
|
|
|
+ fullPath.append(paths[i]).append("/");
|
|
|
+ File file=new File(fullPath.toString());
|
|
|
+ if(!file.exists()){
|
|
|
+ file.mkdir();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ File file=new File(fullPath.toString());//目录全路径
|
|
|
+ if (!file.exists()) {
|
|
|
+ return true;
|
|
|
+ }else{
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public static String byte2hex(byte[] b) { //一个字节的数,
|
|
|
+ // 转成16进制字符串
|
|
|
+ String hs = "";
|
|
|
+ String tmp = "";
|
|
|
+ for (int n = 0; n < b.length; n++) {
|
|
|
+ //整数转成十六进制表示
|
|
|
+ tmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
|
|
|
+ if (tmp.length() == 1) {
|
|
|
+ hs = hs + "0" + tmp;
|
|
|
+ } else {
|
|
|
+ hs = hs + tmp;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tmp = null;
|
|
|
+ return hs;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取 file 的文件名
|
|
|
+ * create date 2016年6月1日
|
|
|
+ * @author 穆再兴
|
|
|
+ * @param
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getFileName(String suffixName, String type){
|
|
|
+ long time = new Date().getTime();
|
|
|
+ Long timeStr = new Long(time);
|
|
|
+ return timeStr + "." + type;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对字节数组字符串进行Base64解码生成图片 并存入对应的路径
|
|
|
+ * create date 2016年6月1日
|
|
|
+ * @author 穆再兴
|
|
|
+ * @param imgStr Base64字符串
|
|
|
+ * @param imgFilePath 存入的路径
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean generateImage(String imgStr, String imgFilePath) {
|
|
|
+ if (imgStr == null) {return false;}// 图像数据为空
|
|
|
+ try {
|
|
|
+ // Base64解码
|
|
|
+ @SuppressWarnings("restriction")
|
|
|
+ byte[] bytes = decoder.decodeBuffer(imgStr);
|
|
|
+ for (int i = 0; i < bytes.length; ++i) {
|
|
|
+ if (bytes[i] < 0) {// 调整异常数据
|
|
|
+ bytes[i] += 256;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 生成图片
|
|
|
+ File file = new File(imgFilePath);
|
|
|
+ FileUtils.writeByteArrayToFile(file, bytes);
|
|
|
+ return true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
* 查询我发起的/我审核的列表
|
|
|
* @param approvalInfo
|
|
|
* @param pageSize
|
|
@@ -167,20 +332,20 @@ public class ApprovalController {
|
|
|
@RequestParam(value = "totalNum", defaultValue = "0", required = false) Integer totalNum) throws Exception {
|
|
|
ResponseJson rj =new ResponseJson(200, "查询成功", 200);
|
|
|
//获取openid,根据openid查询当前登录人信息
|
|
|
- /*String openId = WechatUtils.getUserBySession(request).getUserOpenid();*/
|
|
|
- String openId = "oaH_GwObiozJFBypUg0wKJjQpBiU";
|
|
|
+ String openId = WechatUtils.getUserBySession(request).getUserOpenid();
|
|
|
+ /*String openId = "oaH_GwObiozJFBypUg0wKJjQpBiU";*/
|
|
|
Admin admin = sysService.getByOpenid(openId);
|
|
|
if(admin == null){
|
|
|
return new ResponseJson(200, "未查询到登录人信息", 500);
|
|
|
}
|
|
|
- if(selectType == null){
|
|
|
- return new ResponseJson(200, "参数不完整,缺少查询类型字段", 500);
|
|
|
- }
|
|
|
- if(selectType == 1){//我发起的
|
|
|
- approvalInfo.setAdminId(admin.getAdminId());
|
|
|
- }else if(selectType == 2){//我审核的
|
|
|
- approvalInfo.setApprovalAdminId(admin.getAdminId());
|
|
|
+ if(selectType != null){
|
|
|
+ if(selectType == 1){//我发起的
|
|
|
+ approvalInfo.setAdminId(admin.getAdminId());
|
|
|
+ }else if(selectType == 2){//我审核的
|
|
|
+ approvalInfo.setApprovalAdminId(admin.getAdminId());
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
PagedResult<ApprovalInfo> pagedResult = approvalOrderService.listApprovalInfo(pageNO, pageSize,approvalInfo,totalNum == null);
|
|
|
|
|
|
if (totalNum != 0) {
|
|
@@ -249,6 +414,71 @@ public class ApprovalController {
|
|
|
if(approvalOrderService.updateApprovalInfo(info) < 1){
|
|
|
return ResponseJson.getFAILURE();
|
|
|
}
|
|
|
+ //判断是生产审批或提货审批
|
|
|
+ if(info.getApprovalType() == 1){
|
|
|
+ //推送微信模板消息通知
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
|
|
|
+ ApprovalProduction production = approvalOrderService.getApprovalProductionById(approvalInfo.getApprovalId());
|
|
|
+ Admin admininfo = new Admin();
|
|
|
+ admininfo.setAdminId(production.getApplicantId());
|
|
|
+ admininfo = sysService.getAdminInfo(admininfo);
|
|
|
+ if(admininfo.getAdminOpenId() == null ){
|
|
|
+ return ResponseJson.getFAILURE();
|
|
|
+ }
|
|
|
+ //通知申请人该审批已通过
|
|
|
+ SendMessageUtil sendMessageUtil = new SendMessageUtil();
|
|
|
+ sendMessageUtil.reviewResultsPush("亲,您提交的申请 "+admin.getAdminName()+" 已处理。",
|
|
|
+ production.getApplicantName(),
|
|
|
+ "通过",
|
|
|
+ format.format(new Date()),
|
|
|
+ "审核通过后可通过公众号进入系统",
|
|
|
+ admininfo.getAdminOpenId(),
|
|
|
+ "url");
|
|
|
+ //通知仓库订单已确认
|
|
|
+ //获取仓库人员openid
|
|
|
+ Admin adminTwo = new Admin();
|
|
|
+ adminTwo.setAdminId(68);//仓库管理员id
|
|
|
+ adminTwo = sysService.get(adminTwo);
|
|
|
+ List<ApprovalProductionItem> items = approvalOrderService.getIteminfo(approvalInfo.getApprovalId());
|
|
|
+ String products = "";
|
|
|
+ Integer num = 0;
|
|
|
+ for(ApprovalProductionItem item : items){
|
|
|
+ products = products + item.getItemProductName()+",";
|
|
|
+ num = item.getItemProductNum()+num;
|
|
|
+ }
|
|
|
+ products = products.substring(0,products.length() - 1);
|
|
|
+ sendMessageUtil.putStoragePush(admininfo.getAdminName()+"的生产订单已确认,请在生产入库后确认",
|
|
|
+ products,
|
|
|
+ ""+num,
|
|
|
+ admin.getAdminName(),
|
|
|
+ "优尼雅仓库",
|
|
|
+ "如有疑问请联系上级领导人",
|
|
|
+ adminTwo.getAdminOpenId(),
|
|
|
+ "url");
|
|
|
+ }else{
|
|
|
+ //通知申请人该提货审批已通过
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
|
|
|
+ ApprovalApplyPick approvalApplyPick = new ApprovalApplyPick();
|
|
|
+ approvalApplyPick.setApprovalId(approvalInfo.getApprovalId());
|
|
|
+ List<ApprovalApplyPick> pickList = applyPickService.getApprovalApplyPickList(approvalApplyPick);
|
|
|
+ String products = "";
|
|
|
+ for(ApprovalApplyPickItem PickItem : pickList.get(0).getListApplyPickItem()){
|
|
|
+ products = products+PickItem.getItemProductName()+",";
|
|
|
+ }
|
|
|
+ products = products.substring(0,products.length()-1);
|
|
|
+ Admin admininfo = new Admin();
|
|
|
+ admininfo.setAdminId(pickList.get(0).getAdminId());
|
|
|
+ admininfo = sysService.getAdminInfo(admininfo);
|
|
|
+ SendMessageUtil sendMessageUtil = new SendMessageUtil();
|
|
|
+ sendMessageUtil.applicationFormPush("您的申领单被 "+admin.getAdminName()+" 通过。",
|
|
|
+ format.format(new Date()),
|
|
|
+ "0000000"+approvalInfo.getApprovalId(),
|
|
|
+ products,
|
|
|
+ "点击查看详情",
|
|
|
+ admininfo.getAdminOpenId(),
|
|
|
+ "url");
|
|
|
+ }
|
|
|
+
|
|
|
}else if((Integer) taskMap.get("status") == 0){//还有下一个审批人,需要增加审批历史任务
|
|
|
if(taskMap.get("users") == null){
|
|
|
return ResponseJson.getFAILURE();
|
|
@@ -274,6 +504,19 @@ public class ApprovalController {
|
|
|
if(approvalOrderService.updateApprovalInfo(info) < 1){
|
|
|
return ResponseJson.getFAILURE();
|
|
|
}
|
|
|
+ //推送微信模板消息通知
|
|
|
+ //查询审批订单信息
|
|
|
+ ApprovalProduction production = approvalOrderService.getApprovalProductionById(approvalInfo.getApprovalId());
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
|
|
|
+ SendMessageUtil sendMessageUtil = new SendMessageUtil();
|
|
|
+ sendMessageUtil.orderReviewResultsPush("你好,你有个订单需要你的审核",
|
|
|
+ production.getApplicantOrderNo(),
|
|
|
+ approvalInfo.getApprovalApplicant(),
|
|
|
+ format.format(new Date()),
|
|
|
+ approvalInfo.getApprovalName(),
|
|
|
+ "点击查看详细信息",
|
|
|
+ approvalAdmin.getAdminOpenId(),
|
|
|
+ "url");
|
|
|
}
|
|
|
}
|
|
|
//添加流程信息记录
|
|
@@ -345,7 +588,10 @@ public class ApprovalController {
|
|
|
return ResponseJson.getFAILURE();
|
|
|
}
|
|
|
List<ApprovalInfo> info = approvalOrderService.getApprovalInfo(approvalInfo);
|
|
|
- rj.addResponseKeyValue("approvalInfo",info);
|
|
|
+ if(info.size() < 1){
|
|
|
+ return ResponseJson.getFAILURE();
|
|
|
+ }
|
|
|
+ rj.addResponseKeyValue("approvalInfo",info.get(0));
|
|
|
return rj;
|
|
|
}
|
|
|
|
|
@@ -368,6 +614,9 @@ public class ApprovalController {
|
|
|
if(admin == null){
|
|
|
return new ResponseJson(200, "未查询到登录人信息", 500);
|
|
|
}
|
|
|
+ Integer appvalId = 0;
|
|
|
+ Integer productNum = 0;
|
|
|
+ String productName = "";
|
|
|
JSONArray jsonRecordss = JSONArray.fromObject(inventoryRecordss);
|
|
|
for (int i = 0; i < jsonRecordss.size(); i++) {
|
|
|
JSONObject jsonRecords = jsonRecordss.getJSONObject(i);
|
|
@@ -403,7 +652,27 @@ public class ApprovalController {
|
|
|
if(approvalOrderService.updateProductionItem(productionItem) < 1){
|
|
|
return new ResponseJson(200, "修改审批产品项失败", 500);
|
|
|
}
|
|
|
+ appvalId = jsonRecords.getInt("approvalId");
|
|
|
+ productNum = productNum + jsonRecords.getInt("actualStorage");
|
|
|
+ productName = productName + jsonRecords.getInt("productName")+",";
|
|
|
+
|
|
|
}
|
|
|
+ //推送入库微信模板消息通知
|
|
|
+ //查询审批订单信息
|
|
|
+ ApprovalInfo approvalInfo = approvalOrderService.getApprovalInfoById(appvalId);
|
|
|
+ SendMessageUtil sendMessageUtil = new SendMessageUtil();
|
|
|
+ productName = productName.substring(0,productName.length() - 1);
|
|
|
+ Admin adminTwo = new Admin();
|
|
|
+ adminTwo.setAdminId(68);//仓库管理员id
|
|
|
+ adminTwo = sysService.get(adminTwo);
|
|
|
+ sendMessageUtil.putStoragePush(approvalInfo.getApprovalName()+"已入库,本次入口总数量"+productNum+"台",
|
|
|
+ productName,
|
|
|
+ ""+productNum,
|
|
|
+ admin.getAdminName(),
|
|
|
+ "优尼雅仓库",
|
|
|
+ "如有疑问请联系上级领导人",
|
|
|
+ adminTwo.getAdminOpenId(),
|
|
|
+ "url");
|
|
|
return rj;
|
|
|
}
|
|
|
}
|