com.sailing.hrm.service.datatable.FormDataManager.java Source code

Java tutorial

Introduction

Here is the source code for com.sailing.hrm.service.datatable.FormDataManager.java

Source

/*
 *  Copyright 2013-2014 the original author or authors.
 *  *
 *  * Licensed under the Apache License, Version 2.0 (the "License");
 *  * you may not use this file except in compliance with the License.
 *  * You may obtain a copy of the License at
 *  *
 *  *     http://www.apache.org/licenses/LICENSE-2.0
 *  *
 *  * Unless required by applicable law or agreed to in writing, software
 *  * distributed under the License is distributed on an "AS IS" BASIS,
 *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  * See the License for the specific language governing permissions and
 *  * limitations under the License.
 *
 */

package com.sailing.hrm.service.datatable;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.snaker.engine.entity.Order;
import org.snaker.engine.helper.DateHelper;
import org.snaker.engine.helper.StringHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.sailing.hrm.common.util.ConvertUtils;
import com.sailing.hrm.persistent.form.bean.DbTable;
import com.sailing.hrm.persistent.form.bean.Field;
import com.sailing.hrm.persistent.form.bean.FormData;
import com.sailing.hrm.persistent.form.bean.SqlData;
import com.sailing.hrm.persistent.form.dao.FormDataDao;
import com.sailing.hrm.service.flow.SnakerEngineFacets;
import com.sailing.hrm.workflow.util.ShiroUtils;

/**
 * ????
 * @author yuqs
 * @since 1.0
 */
@Component
public class FormDataManager {
    @Autowired
    private FormDataDao formDataDao;
    @Autowired
    private SnakerEngineFacets facets;

    /**
     * ????
     * @param formData
     */
    public void save(FormData formData) {
        if (StringUtils.isNotEmpty(formData.getProcessId())) {
            if (StringUtils.isNotEmpty(formData.getOrderId()) && StringUtils.isNotEmpty(formData.getTaskId())) {
                facets.execute(formData.getTaskId(), ShiroUtils.getUsername(), null);
            } else {
                Order order = facets.startAndExecute(formData.getProcessId(), ShiroUtils.getUsername(), null);
                formData.setOrderId(order.getId());
            }
        }
        List<SqlData> sqlDatas = getInsertSQLs(formData);
        formDataDao.save(sqlDatas);
    }

    /**
     * ???ID??
     * @param tables ?
     * @param orderId ?ID
     * @return
     */
    public Map<String, Object> get(List<DbTable> tables, String orderId) {
        List<SqlData> sqlDatas = new ArrayList<SqlData>();
        for (DbTable table : tables) {
            SqlData sqlData = getQuerySQLs(table, orderId);
            sqlDatas.add(sqlData);
        }
        return formDataDao.get(sqlDatas);
    }

    /**
     * ?SQL
     * @param table 
     * @param orderId ?ID
     * @return
     */
    private SqlData getQuerySQLs(DbTable table, String orderId) {
        SqlData sqlData = new SqlData(table);
        StringBuilder builder = new StringBuilder();
        builder.append("SELECT ");
        for (Field field : table.getFields()) {
            String uiName = table.getName() + "_" + field.getName();
            builder.append(field.getName());
            builder.append(" AS ");
            builder.append(uiName);
            builder.append(", ");
        }
        builder.append(" OPERATOR AS ").append(table.getName()).append("_").append("OPERATOR, ");
        builder.append(" OPERATETIME AS ").append(table.getName()).append("_").append("OPERATETIME, ");
        builder.append(" ORDERID AS ").append(table.getName()).append("_").append("ORDERID ");
        builder.append(" FROM T_");
        builder.append(table.getName());
        builder.append(" WHERE ORDERID = ? ORDER BY OPERATETIME DESC");
        sqlData.setSql(builder.toString());
        sqlData.setValues(new Object[] { orderId });
        return sqlData;
    }

    /**
     * ????INSERTSQL?
     * @param formData ??
     * @return
     */
    private List<SqlData> getInsertSQLs(FormData formData) {
        List<SqlData> sqlDatas = new ArrayList<SqlData>();
        Map<DbTable, Map<String, String>> fieldData = formData.getFieldData();
        //Map<DbTable, Map<String, String[]>> subFieldData = formData.getSubFieldData();
        for (Map.Entry<DbTable, Map<String, String>> entry : fieldData.entrySet()) {
            DbTable table = entry.getKey();
            Map<String, String> data = entry.getValue();
            SqlData sqlData = new SqlData(table);
            StringBuilder sql = new StringBuilder();
            StringBuilder fieldNames = new StringBuilder();
            StringBuilder params = new StringBuilder();
            List values = new ArrayList();
            values.add(formData.getOrderId());
            values.add(DateHelper.getTime());
            values.add(ShiroUtils.getUsername());
            for (Field field : table.getFields()) {
                Object dbValue = getDbValue(formData, data.get(field.getName()), field);
                fieldNames.append(field.getName()).append(",");
                params.append("?,");
                values.add(dbValue);
            }
            sql.append(" INSERT INTO T_");
            sql.append(table.getName());
            sql.append(" (ID, ORDERID, OPERATETIME, OPERATOR, ");
            sql.append(fieldNames.substring(0, fieldNames.length() - 1));
            sql.append(")");
            sql.append(" VALUES ('");
            sql.append(StringHelper.getPrimaryKey());
            sql.append("', ?, ?, ?, ");
            sql.append(params.substring(0, params.length() - 1));
            sql.append(")");
            sqlData.setSql(sql.toString());
            sqlData.setTable(table);
            sqlData.setValues(values.toArray());
            sqlDatas.add(sqlData);
        }
        return sqlDatas;
    }

    /**
     * ?
     * @param formData ??
     * @param uiValue ui
     * @param field 
     * @return
     */
    private Object getDbValue(FormData formData, String uiValue, Field field) {
        Object dbValue = null;
        String type = field.getType();
        if (type == null)
            type = "1";//
        try {
            int typeNum = Integer.parseInt(type);
            switch (typeNum) {
            case 1://
                dbValue = uiValue;
                break;
            case 2://
                int length = field.getDataLength();
                if (length < 10) {
                    dbValue = ConvertUtils.convertStringToObject(uiValue, Integer.class);
                } else {
                    dbValue = ConvertUtils.convertStringToObject(uiValue, Long.class);
                }
                break;
            case 3://?
                dbValue = ConvertUtils.convertStringToObject(uiValue, Double.class);
                break;
            case 4://
                dbValue = ConvertUtils.convertStringToObject(uiValue, Date.class);
                break;
            case 5://
                dbValue = uiValue;
                break;
            default:
                dbValue = uiValue;
                break;
            }
        } catch (Exception e) {
            formData.addError(field.getName() + " ?");
        }
        return dbValue;
    }
}