话费整理tools with GOG 施工中

我MM在财务部里头作小会计,每个月回有一张CT发过来的话费清单.每个号码一行.
公司里头有很多个部门,每个部门还有若干电话,有些还有宽带的费用.
现在要做的是将CT的话费单按部门分类好,然后统计出每个部门每个月的话费,网路费.
原来这个工具是用cakephp做的,现在改用GOG 试试

更新:
1-19: 输出界面用的是jqgrid,补一个图




需要Excel的 java库 : JXL

3个域模型
Dept:部门
Phone:电话
Bill:单行的话费

class Dept {
    String name
    static hasMany = [phones:Phone]
}


class Phone {
    String name
    String number
    String type
    static belongsTo = [dept:Dept]
    static hasMany = [bills:Bill]
}


class Bill {
    float price
    Date date = new Date()
    static belongsTo = [phone:Phone]
}


处理excel的服务
class ExcelService {

    boolean transactional = true
    def errors =[]
    def save(FileInputStream file) throws RuntimeException{
        //数据起始行号
        def start_row = 5
        //电话号码列
        def phone_offset=0
        //默认话费列
        def total_offset = 16
        //取数据列的列名 实收,实际要入库的帐单列; 业务号码,帐单上面的号码列名. 用来确认列的序列(有时候电信给的这个帐单列数会有变动,有时17列,有时候又18列)
        static final String TOTAL_COL_NAME = '实收'
        static final String NUMBER_COL_NAME = '业务号码'
       //记录行错误
        def out_errors = []
        //获取第一个sheet
        Workbook workbook = Workbook.getWorkbook(file)
        Sheet sheet = workbook.getSheet(0)
        //获取日期,精确到月即可,在A3格中.表格数据:计费帐期:2008/12/01--2008/12/31
        def date_m = sheet.getCell("A3").getContents()=~ /:(\d{4}\/\d{2}\/\d{2})--/
        def date =(new SimpleDateFormat('yyyy/MM/dd').parse(date_m[0][1]))
        //获取业务号码,实收栏位置
        sheet.getRow(4).each{
            if(it.getContents()==NUMBER_COL_NAME){
                phone_offset = it.getColumn()
            }
            if(it.getContents()==TOTAL_COL_NAME){
                total_offset = it.getColumn()
                return
            }
        }
        //遍历所有行
        (start_row..<sheet.getRows()).each{
            println it
            def cells = sheet.getRow(it);
            def number = cells[phone_offset].getContents()
            def price =Float.parseFloat(cells[total_offset].getContents())
            def  phone= Phone.findByNumber(number)
            println number
            if(phone){
                println phone.name+"[${it}]:number=${number},price=${price}"
                phone.addToBills(price:price,date:date).save()
            }else{
                this.errors.add("行[${it}]:没有找到对应的号码[${number}]")
            }
        }
        if(this.errors.size()){
            throw new RuntimeException("多行没有找到对应的号码!")
        }
    }
}

你可能感兴趣的:(.net,Excel,电信,cakephp)