一。自己本机中Oracle数据库的安装情况
PL/SQL连接Oracle数据库
二。Boss帮忙部署FMC_V1.0.0项目的 步骤:
1)SVN,https://60.205.214.58/svn/FMC/branches/FMC_Aeoniamc_trunk
SVN账号,102zhanyubiao zhanyubiao
项目名右键,Maven --》update Project
2)拷贝全了 D:\mavejars 下的文件
3)有些FMC项目上的错误排除,直接剪切再粘体以下子,Ctrl+X,Ctrl+V
4)改了settings.xml 和 <localRepository>D:\mavejars</localRepository>
改了settings_cem_v2.0.xml中的<localRepository>D:/mavejars</localRepository>以及 、和 <profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>Nexus</name>
<url>D:/mavejars/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus</name>
<url>D:/mavejars/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled> </snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
5)在context.xml中添加数据源代码。
<Resource name="jdbc/fmcDataSource"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@192.168.1.28:1521:orcl"
username="FMC_SSC"
password="FMC_SSC"
maxIdle="40"
maxWait="1200"
maxActive="200"
removeAbandoned="true"
removeAbandonedTimeout="180"
logAbandoned="true"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" />
</Context>
6)运行 http://localhost:8888
前端界面出来,按F12,就会出现前端代码的编辑器
三。Maven部署项目
四。SVN在开发中的使用
与
五。在Eclipse中的Debug调试。
首先右击项目选择Debug As -- Debug on Server 或者点击Server面板的小昆虫图标,启动Debug模式。
运行web项目,进行到需要调试的地方,在执行页面操作之前,在即将要运行的代码中添加断点,然后继续执行页面操作,
当代运行到断点处时,Eclipse自动弹出,进入Debug模式,这时就可以按F6 进行观察了。
几个快捷键操作==》F5:Step Into:跳进当前执行的方法中F6:Step Over:跳过该行继续执行F7:Step Return:
从方法中跳出继续执行F8:Resume:全部运行通过,从调试状态恢复Ctrl + R:Run to Line:运行到当前选中的行
在FMC 项目中,后台Java代码需要通过Context 来得到前端Ajax 传过来的数据。而要c'ka查看到前端传过来的数据值,
就必须使用断点,Debug模式!
六。新建一张表,在系统框架下实现最基本的单表CRUD
总结:3个XML + 1个Service类
web.xml
jkurrentMain.xml
Main.xml,系统入口
<!-- 业务相关配置文件 -->
<import resource="process/*/jstream-action-*.xml"/>
<import resource="process/*/jstream-sjmservice-*.xml"/>
<import resource="process/*/jstream-interceptor-*.xml"/>
<!-- 接口相关配置文件 -->
<import resource="process/wsInterface/*/jstream-action-*.xml"/>
<import resource="process/wsInterface/*/jstream-sjmservice-*.xml"/>
<import resource="process/wsInterface/*/jstream-interceptor-*.xml"/>
1)jstream-action-sscWorkGroup.xml文件中的Action 。有前端的H12,network,*.ajax,在Ctrl+H搜索这个*【1个action XML】
改变,系统能够正常跑通,前端操作的时候无法成功。
ref 指定关联的Service类,operations 指定关联的Service类中的某一个具体方法。
<!-- 新增-->
<action id="addSscWorkGroup6666" template="simpleTemplate" interceptors="defaultInterceptors">
<sjmservices>
<sjmservice id="action1" ref="sscWorkGroupService" operations="addSscWorkGroup"></sjmservice>
</sjmservices>
</action>
2)public class SscProperty6666Service extends BaseService {【1个Service类】 *1**********************************1*
增删改查,方法。 【查询比较特殊,select、setNewPageData、resultMap。。。而增删改,用sqlMap】
public class SscWorkGroupService extends BaseService {
/**
* 分页查询工作组
* @param ctx
*/
public void qrySscWorkGroupPage(Context ctx) { 【通过Context 获取前端操作所对应的信息】
logger.debug("-------------start to qrySscWorkGroupPage---------------");
logger.debug("print request data = [" + ctx.getDataMap().toString());
try {
UserInfo userInfo = this.getUserInfo(); // 当前认证用户信息
// 封装页面查询参数
Map<String, Object> paraMap = ctx.getDataMap();
paraMap.put("corpId", userInfo.getCorpid()); 【查询比较特殊,select、setNewPageData、resultMap。而增改删用sqlMap】
// 执行查询操作
this.setNewPageData("ssc6666.qrySscGroupPage", ctx, paraMap); 【系统能跑通,在点击共享中心==》工作组时候弹出==》分页查询工作组失败。1个。操作时后台报错,Mapped Statements collection does not contain value for ssc6666.qrySscGroupPage。若是sql.xml中的<mapper namespace="ssc666">则是多个】
} catch(Exception e) {
throw new SscModuleException(SscModuleErrorCode.SSC_QRYSSCWORKGROUPPAGE_ERROR_CODE, "分页查询工作组信息失败!");
}
}
3)ssc_SqlMap.xml,【1个sql XML(若为某板则是Java方法实现具体的功能) 】 *2**********************************2*
Main.xml==》db.xml==》sqlMap.xml
<mapper namespace="ssc666">【存放Service中需要调用的SQL方法。系统能跑通,在点击共享中心==》工作组时候弹出==》分页查询工作组失败。和 ==》我的工作台==》查询工作组成员失败。等多个】
Service中方法的方法体中,所调用的具体的实现方法,若是CRUD则为SQL语句,若为某板则为实现方法
数据库中字段、类的封装,具体的SQL语句
<!-- 工作组信息Map -->
<resultMap id="WorkGroup_resultMap6666" type="hashmap">【select查询操作要用到。系统跑不通,Could not find result map ssc.WorkGroup_resultMap,编译的时候是在找select调用时】
<!-- 工作组ID -->
<id column="ID" property="id"></id>
<!-- 企业ID -->
<result column="CORPID" property="corpId"></result>
<!-- 工作组名 -->
<result column="NAME" property="name"></result>
<!-- 描述 -->
<result column="DESCRIPTION" property="description"></result>
<select id="qrySscGroupPage" resultMap="WorkGroup_resultMap"> 【select调用时】
<!-- 分页查询用户组信息 -->
<select id="qrySscGroupPage" resultMap="WorkGroup_resultMap6666">【select查询在用。系统跑不通,Could not find result map ssc.WorkGroup_resultMap6666,编译调用在select时】
SELECT ID,CORPID,NAME,DESCRIPTION,BILLCOUNTONCE,BILLCOUNTLIMIT,ENABLE,
TO_CHAR(CREATETIME,'YYYY-MM-DD HH24:MI:SS') CREATETIME,
TO_CHAR(MODIFYTIME,'YYYY-MM-DD HH24:MI:SS') MODIFYTIME
FROM T_SSC_SYS_GROUP
<where>
CORPID=#{corpId}
<if test="name != null and name != ''">
AND NAME LIKE '%'||#{name}||'%'
</if>
<if test="description != null and description != ''">
AND DESCRIPTION LIKE '%'||#{description}||'%'
</if>
4)jstream-sjmservice-ssc.xml文件中,【1个service XML】
改变,系统无法跑通,No bean named 'sscWorkGroupService' is defined
改变,系统无法跑通,No bean named 'sscWorkGroupService' is defined
<!-- 工作组 -->
<sjmservice id="sscWorkGroupService6666" class="com.stream.ssc.SscWorkGroupService"></sjmservice>
七。二次研发,实现新需求
个人相关==》已办任务==》新加两个结束按钮
TFmcWfPersontask_SqlMap.xml文件下
<!-- 查询个人已完成的任务列表 -->
<select id="selectCompleteTasksWithPersonal" resultMap="billWorkFlow.queryTaskAgentMap">
SELECT
MM.MID,
MM.BILLNO,
MM.CREATERID,
MM.NAME,
MM.TASKID,
MM.COMPLETETIME,
MM.EXECID,
MM.NODEID,
MM.NODENAME,
MM.PROCESSID,
MM.PROCESSNAME,
MM.CORPID,
MM.PROCESSINST,
MM.TYPEID,
MM.OWNER,
MM.ASSIGNEE,
MM.loginName,
MM.DEPTNAME,
MM.AMOUNT,
MM.CREATETIME,
MM.billName,
MM.showType,
MM.attachmentCount,
MM.remark,
MM.TASKSOURCE,
MM.memo
FROM
( SELECT M.ID AS mId,
M.BILLNO AS billNo,
M.CREATER CREATERID,
E.NAME AS name,
R.TASKID AS taskId,
TO_CHAR(R.COMPLETETIME, 'yyyy-MM-dd HH24:mi:ss') AS completeTime,
R.Executionid as execId,
A.SHOWTYPE as nodeName,
R.PROCESSDEFINITIONID AS processId,
B.PROCESSNAME AS processName,
M.CORPID AS corpId,
R.PROCESSINSTANCEID AS processInst,
M.BILLTYPE AS typeId,
R.OWNER,
R.ASSIGNEE,
#{assignee} loginName,
M.CREATERDEPT AS deptName,
R.NODEID as nodeId,
TO_CHAR(M.originalcurrencysum,'FM99999999990.0099') AS amount,
TO_CHAR(R.CREATETIME, 'yyyy-MM-dd HH24:mi:ss') AS createTime,
BI.BILLNAME AS billName ,
A.SHOWTYPE AS showType,
nvl(M.attachmentCount, 0) as attachmentCount,
M.remark,
R.TASKSOURCE,
M.REMARK MEMO
FROM T_FMC_BILL_MAINDATA M
LEFT JOIN T_FMC_WF_PERSONTASK R ON M.BILLNO = R.BUSINESSKEY
LEFT JOIN T_FMC_SYS_EMPLOYEE E ON E.ID = M.CREATER
LEFT JOIN T_FMC_WF_ATTRBUT A ON A.NODEID = R.NODEID AND A.PROCESSDEFINITIONID = R.PROCESSDEFINITIONID
LEFT JOIN T_FMC_WF_BASEMESSAGE B ON B.PROCESSDEFINITIONID = R.PROCESSDEFINITIONID
LEFT JOIN T_FMC_BILL_BILLINFO BI ON BI.ID = M.BILLTYPE
WHERE R.STATUS != 'active' AND NVL(R.ISJUMP, '1') != '0'
AND (R.ASSIGNEE = #{assignee} OR R.OWNER=#{assignee})
AND M.CORPID = #{corpId}
<!-- AND R.COMPLETETIME = ( -->
<!-- SELECT MAX(PK.COMPLETETIME) FROM T_FMC_WF_PERSONTASK PK -->
<!-- WHERE PK.NODEID = R.NODEID AND PK.PROCESSDEFINITIONID = R.PROCESSDEFINITIONID -->
<!-- AND PK.BUSINESSKEY = R.BUSINESSKEY -->
<!-- ) -->
AND NOT EXISTS (SELECT 1 FROM T_FMC_WF_PERSONTASK K WHERE K.NODEID = R.NODEID AND K.PROCESSDEFINITIONID = R.PROCESSDEFINITIONID
AND K.BUSINESSKEY = R.BUSINESSKEY AND K.ASSIGNEE = R.ASSIGNEE AND K.STATUS IN ('active'))
) MM
<where>
<if test="billNo != null and billNo != ''">
AND MM.BILLNO LIKE '%'||#{billNo}||'%'
</if>
<if test="name != null and name != ''">
AND MM.NAME LIKE '%'||#{name}||'%'
</if>
<if test="billAmountBegin != null and billAmountBegin != ''">
AND MM.AMOUNT <![CDATA[>=]]> #{billAmountBegin}
</if>
<if test="billAmountEnd != null and billAmountEnd != ''">
AND MM.AMOUNT <![CDATA[<=]]> #{billAmountEnd}
</if>
<if test="createTimeBegin != null and createTimeBegin != ''">
AND TO_CHAR(TO_DATE(MM.CREATETIME),'YYYY-MM-DD') <![CDATA[>=]]> #{createTimeBegin}
</if>
<if test="createTimeEnd != null and createTimeEnd != ''">
AND TO_CHAR(TO_DATE(MM.CREATETIME),'YYYY-MM-DD') <![CDATA[<=]]> #{createTimeEnd}
</if>
<if test="billName != null and billName != ''">
AND MM.billName LIKE '%'||#{billName}||'%'
</if>
<if test="showType != null and showType != ''">
AND MM.showType LIKE '%'||#{showType}||'%'
</if>
<if test="memo != null and memo != ''">
AND MM.MEMO LIKE '%'||#{memo}||'%'
</if>
<if test="orderByCause != null and orderByCause != ''">
ORDER BY ${orderByCause}
</if>
<if test="orderByCause == null or orderByCause == ''">
ORDER BY MM.COMPLETETIME DESC
</if>
</where>
</select>
八。二次研发,实现新需求【【因为好多方法是封装好的模板,在各个地方会存在多次调用,所以最好不要去改,而是仿照着方法模板,自己另外写出新的具体方法来实现具体的功能】】
付管理==》网银支付==》导出
1)PaymentBaseService.java文件下
/** ******************** 网银支付列表导出 begin**************************************************************************************************** **/
/**
* 功能:网银支付列表导出
* @Title: exportPaymentFundPayList
* @Description:
* @param
* @return void
* @author zhulong
* @throws Exception
* @date 2018年2月6日
*/
public void exportPaymentFundPayList(Context context) throws Exception {
try {
/**查询结果集**/
List<Map<String, Object>> paymentFundPayList = new ArrayList<Map<String,Object>>();
/**查询条件**/
Map<String, Object> conditionMap = new HashMap<String, Object>();
conditionMap.put("corpId", this.getUserInfo().getCorpid());
conditionMap.put("empId", this.getUserInfo().getEmployeeId());
//根据查询条件导出(跟当前查询数据一致)
conditionMap.putAll(context.getDataMap());
paymentFundPayList = sqlMap.queryForList("PaymentSqlMap.exportPaymentFundPayDataAgribank", conditionMap);
//导出的文件名
String fileName = "中国农业银行离线制单导入文件.xls";
//自己写的导出
Workbook workbook = ExportExcelUtil.exportAgribank(fileName, paymentFundPayList);
/** 获得response对象**/
HttpServletResponse response = (HttpServletResponse) context.getChannelContext().getResponse();
/** 设置编码格式**/
response.setCharacterEncoding("UTF-8");
response.setContentType("application/x-download");
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
/** 流输出**/
OutputStream out = response.getOutputStream();
workbook.write(out);
out.close();
} catch (Exception e) {
throw e;
}
}
private LinkedHashMap<String, String> getTitles() {
LinkedHashMap<String, String> titles = new LinkedHashMap<String, String>();
titles.put("billNo", "单据编号");
titles.put("billName", "单据名称");
titles.put("reqOrgName", "机构名称");
titles.put("recAccountNo", "收款方账号");
titles.put("recAccountName", "收款方户名");
titles.put("recBankName", "收款行名称");
titles.put("bankPayType", "公私标识");
titles.put("amount", "金额(元)");
titles.put("pushDate", "发送时间");
titles.put("payDate", "付款时间");
titles.put("payStatus_name", "支付状态");
titles.put("payMethod", "支付方式");
return titles;
}
/** ******************** 网银支付列表导出end **************************************************************************************************** **/
2)ExportExcelUtil.java文件
/** ******************** 网银支付列表导出农业银行离线文件Begin **************************************************************************************************** **/
/**
* 导出List<Map<String, Object>>数据到Excel中
* @param fileName 文件名,以.xls或.xlsx结尾,以区分是Excel2003或更高版本
* @param titles 第一行标题,key是表头代码(取数据时用到),value是表头名称, LinkedHashMap为了保证顺序
* @param dataList 数据
* @return
*/
public static Workbook exportAgribank(String fileName, List<Map<String, Object>> paymentFundPayList) {
return exportAgribank(fileName, paymentFundPayList, "yyyy-MM-dd HH:mm:ss");
}
/**
* 导出List<Map<String, Object>>数据到Excel中
* @param fileName 文件名,以.xls或.xlsx结尾,以区分是Excel2003或更高版本
* @param titles 第一行标题,key是表头代码(取数据时用到),value是表头名称, LinkedHashMap为了保证顺序
* @param dataList 数据
* @param pattern 日期格式
* @return
*/
public static Workbook exportAgribank(String fileName, List<Map<String, Object>> paymentFundPayList, String pattern) {
// 第一步,创建一个workbook,对应一个Excel文件
Workbook workbook = ExcelFileUtil.getFormatWorkbook(fileName);
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
int indexDot = fileName.indexOf('.');
String sheetName = indexDot == -1 ? fileName : fileName.substring(0, indexDot);
Sheet sheet = workbook.createSheet(sheetName);
// 第三步,创建标题行一
//定义格式
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
Row row0 = sheet.createRow(0);
row0.createCell(5).setCellValue("中国农业银行离线制单导入文件");//放置在第五个单元格,实现居中效果
// 第四步,创建标题行二
Row row1 = sheet.createRow(1);
row1.createCell(0).setCellValue("编号");
row1.createCell(1).setCellValue("付款方账户类型");
row1.createCell(2).setCellValue("付款方账号");
row1.createCell(3).setCellValue("收款方账号");
row1.createCell(4).setCellValue("收款方户名");
row1.createCell(5).setCellValue("是否农行账户");
row1.createCell(6).setCellValue("开户银行(行别)");
row1.createCell(7).setCellValue("开户大额行号");
row1.createCell(8).setCellValue("开户行支行名称");
row1.createCell(9).setCellValue("金额");
row1.createCell(10).setCellValue("预约日期");
row1.createCell(11).setCellValue("用途(附言)");
// 第五步,创建数据行
Row row2 = sheet.createRow(2);
int i = 1;
if(paymentFundPayList != null) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
for(Map<String, Object> data : paymentFundPayList) {
row2 = sheet.createRow(++i);
Cell cell0 = row2.createCell(0);//第一列
Object value0 = data.get("billNo");
if(value0 != null) {
if (value0 instanceof Double) {
cell0.setCellValue((Double)value0);
} else if (value0 instanceof Date) {
cell0.setCellValue(sdf.format((Date)value0));
} else {
cell0.setCellValue(value0.toString());
}
}
Cell cell1 = row2.createCell(1);//第二列cell1 为下拉框,POI导出Excel中的单元格设置成下拉框
cell1.setCellValue("1"); //默认值
String[] textlist = { "0", "1", "2", "3"};
//设置第二列的1-最后一行 为下拉列表
CellRangeAddressList regions = new CellRangeAddressList(2, paymentFundPayList.size(), 1, 1);
//创建下拉列表数据
DVConstraint constraint = DVConstraint.createExplicitListConstraint(textlist);
//绑定
HSSFDataValidation dataValidation = new HSSFDataValidation(regions, constraint);
sheet.addValidationData(dataValidation);
Cell cell2 = row2.createCell(2);//第三列付款方账户
Object value2 = data.get("payAccountNo");
if(value2 == null){
cell2.setCellValue("34646001040004242");//默认值
}else {
if (value2 instanceof Double) {
cell2.setCellValue((Double)value2);
} else if (value2 instanceof Date) {
cell2.setCellValue(sdf.format((Date)value2));
} else {
cell2.setCellValue(value2.toString());
}
}
Cell cell3 = row2.createCell(3);//第四列收款方账户
Object value3 = data.get("recAccountNo");
if(value3 != null) {
if (value3 instanceof Double) {
cell3.setCellValue((Double)value3);
} else if (value3 instanceof Date) {
cell3.setCellValue(sdf.format((Date)value3));
} else {
cell3.setCellValue(value3.toString());
}
}
Cell cell4 = row2.createCell(4);//第五列收款方姓名
Object value4 = data.get("recAccountName");
if(value4 != null) {
if (value4 instanceof Double) {
cell4.setCellValue((Double)value4);
} else if (value4 instanceof Date) {
cell4.setCellValue(sdf.format((Date)value4));
} else {
cell4.setCellValue(value4.toString());
}
}
Cell cell5 = row2.createCell(5);
Object value5 = data.get("recBankName");//加判断
String v5 = value5.toString();
if(v5 != null) {
if (v5.indexOf("农行")!=-1 || v5.indexOf("农业银行")!=-1 || v5.indexOf("中国农业银行")!=-1){
//"只要test.indexOf('This')返回的值不是-1说明test字符串中包含字符串'农行',相反如果包含返回的值必定是-1"
cell5.setCellValue("是");
}else{
cell5.setCellValue("否");
}
}
Cell cell6 = row2.createCell(6);
Object value6 = data.get("recBankTypeName");
if(value6 != null) {
if (value6 instanceof Double) {
cell6.setCellValue((Double)value6);
} else if (value6 instanceof Date) {
cell6.setCellValue(sdf.format((Date)value6));
} else {
cell6.setCellValue(value6.toString());
}
}
Cell cell7 = row2.createCell(7);
Object value7 = data.get("recBankTypeCode");
if(value7 != null) {
if (value7 instanceof Double) {
cell7.setCellValue((Double)value7);
} else if (value7 instanceof Date) {
cell7.setCellValue(sdf.format((Date)value7));
} else {
cell7.setCellValue(value7.toString());
}
}
Cell cell8 = row2.createCell(8);
Object value8 = data.get("recBankName");
if(value8 != null) {
if (value8 instanceof Double) {
cell8.setCellValue((Double)value8);
} else if (value8 instanceof Date) {
cell8.setCellValue(sdf.format((Date)value8));
} else {
cell8.setCellValue(value8.toString());
}
}
Cell cell9 = row2.createCell(9);
Object value9 = data.get("amount");
if(value9 != null) {
if (value9 instanceof Double) {
cell9.setCellValue((Double)value9);
} else if (value9 instanceof Date) {
cell9.setCellValue(sdf.format((Date)value9));
} else {
cell9.setCellValue(value9.toString());
}
}
Cell cell10 = row2.createCell(10);
Object value10 = data.get("date"); //预约日期 为空
if(value10 != null) {
if (value10 instanceof Double) {
cell8.setCellValue((Double)value10);
} else if (value10 instanceof Date) {
cell10.setCellValue(sdf.format((Date)value10));
} else {
cell10.setCellValue(value10.toString());
}
}
Cell cell11 = row2.createCell(11);
Object value11 = data.get("porpose");
if(value11 != null) {
if (value11 instanceof Double) {
cell11.setCellValue((Double)value11);
} else if (value11 instanceof Date) {
cell11.setCellValue(sdf.format((Date)value11));
} else {
cell11.setCellValue(value11.toString());
}
}
}
}
return workbook;
}
/** ******************** 网银支付列表导出农业银行离线文件end **************************************************************************************************** **/
3)Payment_SqlMap.xml 文件
<resultMap id="FundDataQry_resultMapAgribank" type="hashmap" extends="FundData_resultMap">
<result column="DATE" property="date"/>
</resultMap>
<!-- 导出支付数据 -->
<select id="exportPaymentFundPayDataAgribank" resultMap="FundDataQry_resultMapAgribank">
SELECT FP.BILLNO, FP.PAYACCOUNTNO, FP.RECACCOUNTNO, FP.RECACCOUNTNAME, FP.RECBANKNAME, FP.RECBANKTYPENAME, FP.RECBANKTYPECODE, FP.RECBANKNAME, FP.AMOUNT,
FP.PURPOSE
FROM T_FMC_FUND_PAYMENT FP
<where>
FP.CORPID = #{corpId}
</where>
</select>
新加功能,导出之后更新字段
/** ******************** 网银支付列表导出 begin**************************************************************************************************** **/
/**
* 功能:网银支付列表导出
* @Title: exportPaymentFundPayList
* @Description:
* @param
* @return void
* @author zhulong
* @throws Exception
* @date 2018年2月6日
*/
public void exportPaymentFundPayList(Context context) throws Exception {
try {
/**查询结果集**/
List<Map<String, Object>> paymentFundPayList = new ArrayList<Map<String,Object>>();
/**查询条件**/
Map<String, Object> conditionMap = new HashMap<String, Object>();
conditionMap.put("corpId", this.getUserInfo().getCorpid());
conditionMap.put("empId", this.getUserInfo().getEmployeeId());
//根据查询条件导出(跟当前查询数据一致)
conditionMap.putAll(context.getDataMap());
//paymentFundPayList = sqlMap.queryForList("PaymentSqlMap.exportPaymentFundPayDataAgribank", conditionMap);
paymentFundPayList = sqlMap.queryForList("PaymentSqlMap.qryPaymentFundPayData", conditionMap);
//导出的文件名
String fileName = "中国农业银行离线制单导入文件.xls";
//农业银行离线导出文件的实现方法
Workbook workbook = ExportExcelUtil.exportAgribank(fileName, paymentFundPayList);
/** 获得response对象**/
HttpServletResponse response = (HttpServletResponse) context.getChannelContext().getResponse();
/** 设置编码格式**/
response.setCharacterEncoding("UTF-8");
response.setContentType("application/x-download");
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
/** 流输出**/
OutputStream out = response.getOutputStream();
workbook.write(out);
out.close();
//导出Excel文件之后修改查询结果中的发送时间字段和支付状态字段,支付状态字段设置成 6付款中
for(int i=0;i<paymentFundPayList.size();i++){
Map<String, Object> paymentMap = paymentFundPayList.get(i);
String fundId =(String)paymentMap.get("id");//此为fundId
//String batchNo =(String)paymentMap.get("batchNo");
Map<String, Object> paraMap = new HashMap<String, Object>();
paraMap.put("corpId", this.getUserInfo().getCorpid());
paraMap.put("fundId", fundId);
//paraMap.put("payStatus", "6");
//paraMap.put("batchNo", batchNo);
sqlMap.update("PaymentSqlMap.updatePaymentStatusAsInPayAgribank", paraMap);
}
} catch (Exception e) {
throw e;
}
}
<!-- 导出农行离线文件之后,修改支付状态为“付款中” -->
<update id="updatePaymentStatusAsInPayAgribank" parameterType="Map">
BEGIN
-- 更新付款表T_FMC_FUND_PAYMENT付款状态为“支付中”
UPDATE T_FMC_FUND_PAYMENT PF
SET PF.PAYSTATUS = '6', PF.PUSHDATE = SYSDATE
WHERE PF.CORPID = #{corpId}
AND PF.ID = #{fundId, jdbcType=VARCHAR};
-- 更新支付表付款状态为“支付中”
UPDATE T_FMC_BILL_PAYMENT BP
SET BP.PAYSTATUS = '6'
WHERE BP.CORPID = #{corpId}
AND BP.ID IN (SELECT PF.PAYMENTID FROM T_FMC_FUND_PAYMENT PF
WHERE PF.ID = #{fundId, jdbcType=VARCHAR});
-- 更新主表支付状态为“支付中”
UPDATE T_FMC_BILL_MAINDATA BM
SET BM.BILLSTATUS='6'
WHERE BM.ID IN (SELECT PF.MAINID
FROM T_FMC_FUND_PAYMENT PF
WHERE PF.ID = #{fundId, jdbcType = VARCHAR});
END;
</update>
九。PL/SQL中快速查看某个表中的各个字段的含意和数据类型==》选中表名==》右键点击View==》点击Columns
十。调式==》支付管理==》网银支付 表BILL_PAYMENT 和表 FUND_PAYMENT中数据的同步
Debug 断点位置 exportPaymentFundPayList 自己之前的位置 paymentFundPayList ==》
数据同步方法==》FUND 表中的 PURPOSE 字段==》搜索 syn ======BillPaymentInfoSynToFundService 、、synPaymentInfoToFund
BillBusiness_SqlMap.xml 文件:
前:前:前:前:前:前:前:前:前:前:前:前:前:【效果,新提交的数据PURPOSE字段会直接在FUND表中查询到】
(SELECT SO.CODE FROM T_FMC_SYS_OBJECT SO WHERE SO.ID = PM.PAYMETHOD) PAYMETHOD,
(SELECT SO.CODE FROM T_FMC_SYS_OBJECT SO WHERE SO.ID = PM.PAYTYPE) PAYTYPE,
(SELECT SO.CODE FROM T_FMC_SYS_OBJECT SO WHERE SO.ID = PM.PURPOSE) PURPOSE,
后:后:后:后:后:后:后:后:后:后:后:后:后:
(SELECT SO.CODE FROM T_FMC_SYS_OBJECT SO WHERE SO.ID = PM.PAYMETHOD) PAYMETHOD,
(SELECT SO.CODE FROM T_FMC_SYS_OBJECT SO WHERE SO.ID = PM.PAYTYPE) PAYTYPE,
PM.PURPOSE PURPOSE, ... ...
十一。系统中某些功能所在的位置
1)点击左侧树形列表,在右侧弹出的页面是并列的两个小页面
2)导入 \ 导出\下载 功能
其中,下载:就是将文件放到项目中,
3)导出之后,查询、更改
4)查询、新增、删除
5)启用/禁用 功能在系统中的位置。【 之前一直找不到是因为往后、往右侧的拖动条没拉 】
在数据库中多对应的字段为 ENABLE
十二。前端输入框中输入的都是字符串,而在数据库中Amout 是Number类型,需要将输入框中的字符串转换成number类型的数据
金额筛选:
<if test="totalAmountMin != null and totalAmountMin != ''">
AND MM.AMOUNT <![CDATA[>=]]> to_number(#{totalAmountMin})
</if>
<if test="totalAmountMax != null and totalAmountMax != ''">
AND MM.AMOUNT <![CDATA[<=]]> to_number(#{totalAmountMax})
</if>
时间筛选:
<if test="createStartTime != null and createEndDate != null">
AND TRUNC(TO_DATE(MM.CREATETIME, 'YYYY-MM-DD HH24:MI:SS')) <![CDATA[>=]]> TRUNC(TO_DATE(#{createStartTime, jdbcType=VARCHAR},'YYYY-MM-DD HH24:MI:SS'))
AND TRUNC(TO_DATE(MM.CREATETIME, 'YYYY-MM-DD HH24:MI:SS')) <![CDATA[<=]]> TRUNC(TO_DATE(#{createEndDate, jdbcType=VARCHAR},'YYYY-MM-DD HH24:MI:SS'))
</if>
<if test="createStartTime != null and createEndDate == null">
AND TRUNC(TO_DATE(MM.CREATETIME, 'YYYY-MM-DD HH24:MI:SS')) <![CDATA[>=]]> TRUNC(TO_DATE(#{createStartTime, jdbcType=VARCHAR},'YYYY-MM-DD HH24:MI:SS'))
</if>
<if test="createStartTime == null and createEndDate != null">
AND TRUNC(TO_DATE(MM.CREATETIME, 'YYYY-MM-DD HH24:MI:SS')) <![CDATA[<=]]> TRUNC(TO_DATE(#{createEndDate, jdbcType=VARCHAR},'YYYY-MM-DD HH24:MI:SS'))
</if>
十三。前端文件的部署,整个项目的运行
dist.zip文件解压,找到nginx服务器目录,解压之后将 D:\nginx-1.2.9\nginx-1.2.9\html 目录下的static文件夹和index.html文件替换掉,
dist.zip解压之后就是static文件夹和index.html文件,是最新的版本
十四。项中接口的规范
十五。二次研发,新需求
十六。
前端数据的展示
十七。IP地址【注意内网IP与外网IP的区别:简单来说呢,外网IP就是标示了您在整个互联网上的地址,就相当于小区的地址;而内网IP,就是标识着您在局域网里面的地址,也就是小区内的几栋几楼几号房子。内网IP局域网,网线都是连接在同一个 交换机上面的,也就是说它们的IP地址是由交换机或者路由器进行分配的。而且每一个IP也是有所不同的,并且这些连接在同一个路由器上的电脑都可以通过internet连接共享的,也就是说网吧里面的电脑是可以访问网吧内另外一部电脑的。外网IP是全世界唯一的IP地址,仅分配给一个网络设备。而内网IP是由路由器分配给每一部内部使用的IP地址,而内网的所有用户都是通过同一个外网IP地址进行上网的】
内网IP的查看
方法一:
方法二:
外网IP
直接百度IP
十八。Linux服务器部署
1)关闭防火墙,应用和数据库的防火墙都要关闭
2)内外IP和外网IP都要能够连接上
3)注意字符格式UTF-8和UTF-8-BOM的区别
4)使用Secure CRT连接服务器,使用FileZilla传送文件。文件的权限设置777可以在FileZilla中进行,也可以使用命令操作。
十九。部署复星项目时,缺少jar包,报错
将jar 包kurrent-security-0.0.9-SNAPSHOT.jar 放置在D:\mavejars\com\kurrent\security\kurrent-security\0.0.9-SNAPSHOT目录下
二十。登录
CustomProvisioningImpl
/**
* FMC权限数据提供实现类
*
* @author wxx
*/
public class CustomProvisioningImpl extends AuthorityProvisionningAdapter implements InitializingBean , ApplicationContextAware {
Line101
key = mobile.matcher(accountArr[1]).matches() ? "mobile" : (email.matcher(accountArr[1]).matches() ? "email" : (samAccountName.matcher(accountArr[1].trim()).matches() ? "no" :"username"));
&&&Line110
userInfo = sqlMap.queryForObject("rbac.account.selectUserInfoByCorp", sqlParam);
billInfoDefinePubFnc.js 文件中:
Line 684
valiArray: {
'000':{ // 非申请类
'1':[ // 申请单
{code:'apply01', text:'借款区金额 = 付款区实付金额'},
{code:'apply02', text:'借款区金额 <= 主表区金额'},
{code:'apply03', text:'明细区每行金额均大于0'},
{code:'apply04', text:'主表区金额大于0'},
{code:'apply05', text:'明细区金额与标准区金额相等'},
{code:'apply06', text:'每条明细行必须执行分摊'}, // expense09
{code:'apply07', text:'借款区金额=主表区金额'} // 借款单添加规则
],
Line 725
'001':{ // 申请类
'1':[ // 申请单
{code:'apply01', text:'借款区金额 = 付款区实付金额'},
{code:'apply02', text:'借款区金额 <= 主表区金额'},
{code:'apply03', text:'明细区每行金额均大于0'},
{code:'apply04', text:'主表区金额大于0'},
{code:'apply05', text:'明细区金额与标准区金额相等'},
{code:'apply06', text:'每条明细行必须执行分摊'}, // expense09
{code:'apply07', text:'借款区金额=主表区金额'} // 借款单添加规则
],
----------------------------------------------- 我是低调的分隔线 -----------------------------------------------