/** * */ package jp.agentec.sinaburocast.action.batch; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import jp.agentec.sinaburocast.action.AbstractAction; import jp.agentec.sinaburocast.common.SinaburoConstant; import jp.agentec.sinaburocast.common.util.PropertyUtil; import jp.agentec.sinaburocast.common.util.SinaburoUtil; import jp.agentec.sinaburocast.csv.MemberMigrationInfoCsv; import jp.agentec.sinaburocast.csv.PointMigrationInfoCsv; import jp.agentec.sinaburocast.entity.Member; import jp.agentec.sinaburocast.entity.PointGet; import jp.agentec.sinaburocast.form.batch.MemberMigrationInfoRegistForm; import jp.agentec.sinaburocast.service.MemberService; import jp.agentec.sinaburocast.service.PointGetService; import jp.agentec.sinaburocast.service.csv.CsvService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.apache.velocity.tools.generic.DateTool; import org.seasar.framework.beans.util.BeanMap; import org.seasar.framework.beans.util.Beans; import org.seasar.framework.util.FileUtil; import org.seasar.framework.util.StringUtil; import org.seasar.struts.annotation.ActionForm; import org.seasar.struts.annotation.Execute; /** * @author choi-c * * 会員情報一括登録[マイグレーション用] * */ public class MemberMigrationInfoRegistAction extends AbstractAction { private final Logger logger = Logger.getLogger(getClass()); @ActionForm public MemberMigrationInfoRegistForm memberMigrationInfoRegistForm; public CsvService csvService;//<MemberMigrationInfoCsv> <PointMigrationInfoCsv> public MemberService memberService; /** * 会員一括登録 */ //@Execute(validator = true, input="/admin/member/memberRegistAll/") @Execute(validator = false) //@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.UPLOAD,target="会員一括登録",detail="アップロード",screenId=SinaburoConstant.screenId.CMM0006) public String memberUpload() throws Exception { if(StringUtil.isBlank(memberMigrationInfoRegistForm.fileFullPath) ){ logger.fatal("ファイルパスを指定してください。"); return null; } File file = new File(memberMigrationInfoRegistForm.fileFullPath); if(!file.exists()){ logger.fatal("ファイルパスが不正です。ファイルパス:"+memberMigrationInfoRegistForm.fileFullPath); return null; } int result = 0; String csvData = null; InputStream in = null; try { in = new FileInputStream(file); //バイナリ形式チェック byte[] b = new byte[1]; while (in.read(b, 0, 1) > 0) { if (b[0] == 0) { logger.fatal("バイナリ形式のファイルなので処理を完了します。"); return null; } } } finally { IOUtils.closeQuietly(in); } try { in = new FileInputStream(file); //20170508 SJIS文字化け対応 csvData = IOUtils.toString(in, "Windows-31J"); } finally { IOUtils.closeQuietly(in); } StringBuffer isOk = new StringBuffer("OK"); //List<MemberInfoCsv> memberCsvList = csvService.parseAll(csvData, MemberInfoCsv.class,isOk); List<MemberMigrationInfoCsv> memberCsvList = null; try { memberCsvList = csvService.parseAll(csvData, MemberMigrationInfoCsv.class,isOk); } catch (org.seasar.s2csv.csv.exception.CSVFormatException e) { logger.fatal(PropertyUtil.getString("ファイルが不正です。")); return null; }catch(NumberFormatException e){ logger.fatal("ファイルが不正です。"); return null; } if (CollectionUtils.isEmpty(memberCsvList)) { logger.fatal("登録対象のデータが存在しないので登録できません。"); return null; } String insertUser=PropertyUtil.getString("BATCH_UPDATE"); for (MemberMigrationInfoCsv memberMigrationInfoCsv : memberCsvList) { memberMigrationInfoCsv.insertResult="OK"; if(StringUtil.isBlank(memberMigrationInfoCsv.pointNum))memberMigrationInfoCsv.pointNum="0"; Member member = Beans.createAndCopy(Member.class, memberMigrationInfoCsv).execute(); try { memberService.insert(member,insertUser); } catch (Exception e) { memberMigrationInfoCsv.insertResult="NG"; } //result = memberService.insert(null); } /**結果ファイル作成*/ String dateStr = new DateTool().format("yyyyMMdd_HHmmss",DateTool.getSystemDate()); //20170508 SJIS文字化け対応 String outStr = SinaburoUtil.addDoubleStr(csvService.getContents(memberCsvList, MemberMigrationInfoCsv.class).replace("\"", "")); outStr = SinaburoUtil.toSJIS(outStr); FileUtil.write(memberMigrationInfoRegistForm.fileFullPath+"_"+dateStr, outStr.getBytes("Windows-31J")); //FileUtil.write(memberMigrationInfoRegistForm.fileFullPath+"_"+dateStr, SinaburoUtil.addDoubleStr(csvService.getContents(memberCsvList, MemberMigrationInfoCsv.class).replace("\"", "")).getBytes("Shift_JIS")); /**一括登録*/ //result = memberService.memberAllRegist(memberCsvList, getAdmin()); logger.info("一括更新件数:"+memberCsvList.size()); return null; } public PointGetService pointGetService; @Execute(validator = false) //@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.UPLOAD,target="会員一括登録",detail="アップロード",screenId=SinaburoConstant.screenId.CMM0006) public String pointUpload() throws Exception { if(StringUtil.isBlank(memberMigrationInfoRegistForm.fileFullPath) ){ logger.fatal("ファイルパスを指定してください。"); return null; } File file = new File(memberMigrationInfoRegistForm.fileFullPath); if(!file.exists()){ logger.fatal("ファイルパスが不正です。ファイルパス:"+memberMigrationInfoRegistForm.fileFullPath); return null; } int result = 0; String csvData = null; InputStream in = null; try { in = new FileInputStream(file); //バイナリ形式チェック byte[] b = new byte[1]; while (in.read(b, 0, 1) > 0) { if (b[0] == 0) { logger.fatal("バイナリ形式のファイルなので処理を完了します。"); return null; } } } finally { IOUtils.closeQuietly(in); } try { in = new FileInputStream(file); //20170508 SJIS文字化け対応 csvData = IOUtils.toString(in, "Windows-31J"); //csvData = IOUtils.toString(in, "Shift_JIS"); } finally { IOUtils.closeQuietly(in); } StringBuffer isOk = new StringBuffer("OK"); //List<MemberInfoCsv> memberCsvList = csvService.parseAll(csvData, MemberInfoCsv.class,isOk); List<PointMigrationInfoCsv> pointCsvList = null; try { pointCsvList = csvService.parseAll(csvData, PointMigrationInfoCsv.class,isOk); } catch (org.seasar.s2csv.csv.exception.CSVFormatException e) { logger.fatal(PropertyUtil.getString("ファイルが不正です。")); return null; }catch(NumberFormatException e){ logger.fatal("ファイルが不正です。"); return null; } if (CollectionUtils.isEmpty(pointCsvList)) { logger.fatal("登録対象のデータが存在しないので登録できません。"); return null; } String insertUser=PropertyUtil.getString("BATCH_UPDATE"); ArrayList<Integer> memberIdList = new ArrayList<Integer>(); for (PointMigrationInfoCsv pointMigrationInfoCsv : pointCsvList) { pointMigrationInfoCsv.pointGetDate=setvalidatePointDate(pointMigrationInfoCsv.pointGetDateInput); PointGet pointGet = Beans.createAndCopy(PointGet.class, pointMigrationInfoCsv).execute(); if(!memberIdList.contains(pointMigrationInfoCsv.memberId)){ memberIdList.add(pointGet.memberId); } if(StringUtil.equals(pointMigrationInfoCsv.okNg, "OK")||pointMigrationInfoCsv.okNg == null){ pointMigrationInfoCsv.insertResult="OK"; } else{ pointMigrationInfoCsv.insertResult="NG";//NGの場合登録しない。 continue; } //マイナスは登録しない if(pointGet.pointGetNum<0){ pointMigrationInfoCsv.insertResult="NG";//NGの場合登録しない。 continue; } try { pointGetService.insertPointGet(pointGet,insertUser); } catch (Exception e) { pointMigrationInfoCsv.insertResult="NG"; } } //PointGetが多い場合MEMBERのPOINT_NUMにあわせる。 for (Integer fmemberId : memberIdList) { BeanMap beanMap =pointGetService.getDefaultPoint(fmemberId); if(beanMap != null && StringUtil.equals("P", beanMap.get("mp").toString()) ){ int herasPoint=(int)((Long)beanMap.get("herasupoint")).doubleValue();//&& beanMap.get() m.MEMBER_ID ,M.POINT_NUM ,P.zan ppoint, (CASE WHEN M.POINT_NUM > P.ZAN THEN 'M' WHEN M.POINT_NUM < P.ZAN THEN 'P' END) MP pointGetService.cutDownPointLogicForMaigration( herasPoint, fmemberId,insertUser); } } //会員テーブルのポイントが大きいリスト出力 List<BeanMap> memberLargeList = pointGetService.memberPointLarge(); StringBuilder sb = new StringBuilder(); sb.append(SinaburoConstant.newLine.RN); sb.append(SinaburoConstant.newLine.RN); sb.append(SinaburoConstant.newLine.RN); sb.append("・会員テーブルのポイントが大きいリスト。"); sb.append(SinaburoConstant.newLine.RN); sb.append("会員ID\tポイントPOINT_GET\tポイントMember\tPOINT_GET/Member"); sb.append(SinaburoConstant.newLine.RN); if(!CollectionUtils.isEmpty(memberLargeList)){ for (BeanMap memberLargeMap : memberLargeList) { sb.append(memberLargeMap.get("memberId")+"\t"+memberLargeMap.get("ppoint").toString()+"\t"+memberLargeMap.get("pointNum").toString()+"\t"+memberLargeMap.get("mp").toString()); sb.append(SinaburoConstant.newLine.RN); } } /**結果ファイル作成*/ String dateStr = new DateTool().format("yyyyMMdd_HHmmss",DateTool.getSystemDate()); //20170508 SJIS文字化け対応 String outStr = SinaburoUtil.addDoubleStr(csvService.getContents(pointCsvList, PointMigrationInfoCsv.class).replace("\"", "")+sb.toString()); outStr = SinaburoUtil.toSJIS(outStr); FileUtil.write(memberMigrationInfoRegistForm.fileFullPath+"_"+dateStr, outStr.getBytes("Windows-31J")); //FileUtil.write(memberMigrationInfoRegistForm.fileFullPath+"_"+dateStr, SinaburoUtil.addDoubleStr(csvService.getContents(pointCsvList, PointMigrationInfoCsv.class).replace("\"", "")+sb.toString()).getBytes("Shift_JIS")); /**一括登録*/ //result = memberService.memberAllRegist(memberCsvList, getAdmin()); logger.info("一括更新件数:"+pointCsvList.size()); return null; } public String setvalidatePointDate(String args) { Date date = null; SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); if(StringUtil.isBlank(args)) return ""; format.setLenient(false); try { date=format.parse(args); } catch (ParseException e) { return ""; } format = new SimpleDateFormat("yyyyMMdd"); return format.format(date); } } ///** // * // */ //package jp.agentec.sinaburocast.action.batch; // //import jp.agentec.sinaburocast.action.AbstractAction; //import jp.agentec.sinaburocast.common.util.PropertyUtil; //import jp.agentec.sinaburocast.service.EnqueteService; // //import org.apache.log4j.Logger; //import org.seasar.struts.annotation.Execute; // ///** // * @author arakawa // * // */ //public class MemberMigrationInfoRegist extends AbstractAction { // private final Logger logger = Logger.getLogger(getClass()); // // public EnqueteService enqueteService; // // @Execute(validator=false) // public String index() throws Exception { // // //アンケートステータスを未実施から実施中に変更する // enqueteService.updateStatusToEnforcement(PropertyUtil.getString("BATCH_UPDATE")); // // //アンケートステータスを実施中から完了に変更する // enqueteService.updateStatusToComplete(PropertyUtil.getString("BATCH_UPDATE")); // // return null; // } // //}