OPICS 节假日维护

  • 这是重新找回老帐号的第一篇回归文
    • 背景介绍
    • 非本地化设计的痛点
    • 技术分析
    • 技术解决方案设计
    • 具体实现
    • 后序

这是重新找回老帐号的第一篇回归文

再次回归IT领域,发现很多东西发展很快,但同时很多以前的干货时不时确实可以捡起来继续用,自己知识的累计沉淀还是很有必要的,现在回过头发现过去留下的太少太少,现在开始重新积累。

背景介绍

OPICS系统是MYSIS的资金管理系统(现在已被FINSTRA收购),作为一个从KONDOR时代走来的人来说,本应是驾轻就熟的,然而网上有关的资料真是非常的稀少,作为日常运维,节假日表的维护是再正常不过的操作,然而系统架构非本地化的设计使得维护的工作显得异常痛苦并伴随着极大的操作风险。

非本地化设计的痛点

根据界面可以看到币别的节假日维护大概有如下特性:

  • 指定日历日期
  • 指定日期
  • 固定每周的时间

这个设计本身来说灵活性还可以,但是对于CNY的特殊性,这个设计就比较有缺陷了,主要是因为周六周日可能也会有调整成工作日的可能性,以至于CNY的设置无法使用固定每周,不得不用指定日期进行维护,想到每年的周六周日日期,这个数据量着实有点吓到我了,由此引出了本篇。

技术分析

作为一个IT人,总要想办法用技术手段提高一下效率,用界面一个一个录入,且不说工作量,就正确性而言也很保证。
首先想到的就是从后台数据库着手,查找相关数据字典,得到该表,尝试插入节假日日期,发现界面并无显示,很显然可能有一堆中间业务表,至此这条路不能这样走下去;
通过与厂商沟通发现在做数据迁移时,该功能背后有一个配置文件如下,看到这个文件的时候,我很开心,对于一个和EXCEL打了很多年交道的人来说,1900-1-1至今天日期的long数字型表达实在太熟悉了,配置文件如此的清晰,立马决定尝试一下,在行内依葫芦画瓢的设了一个新的值进去,更新后发现界面也更新了,验证了一下后台数据库的数据也有了该记录,证明该方法可行,那接下来只要我们照着这样的格式就行了。

技术解决方案设计

源数据用EXCEL直接处理成long,标识币种(Excel便于模板制作,直观可控)
程序批量读取EXCEL,读取INI写入相应币种节假日(为了程序更好的使用,EXCEL操作引用NPOI,避免一定要安装EXCEL以及32,64位OFFICE DLL库引用的麻烦)

具体实现

接下来就是程序的分功能实现及组装了,网上的例子其实很多,随便找了一下能用的代码片段组装起来就好,对于不创造核心算法的IT人来说,高级语言就是LEGO组装,把功能拼装在一起实现需要的功能。

// Sample for INI read & write
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using System.IO;
using System.Runtime.InteropServices;class IniFile
{/* * 声明API函数 */public string iniPath;[DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);[DllImport("kernel32")]private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);/// <summary>  /// 构造函数  /// </summary>  /// <param name="iniPath">ini文件路径,默认为当前路径下default.ini</param>  public IniFile(string iniPath = "./default.ini"){this.iniPath = iniPath;}/// <summary>  /// 写入ini文件  /// </summary>  /// <param name="Section">Section</param>  /// <param name="Key">键</param>  /// <param name="Value">值</param>  public void writeIni(string Section, string Key, string Value){WritePrivateProfileString(Section, Key, Value, this.iniPath);}/// <summary>  /// 写入ini文件,不管section,默认放在default里  /// </summary>  /// <param name="Key">键</param>  /// <param name="Value">值</param>  public void writeIni(string Key, string Value){WritePrivateProfileString("default", Key, Value, this.iniPath);}/// <summary>  /// 读取ini文件  /// </summary>  /// <param name="Section">Section</param>  /// <param name="Key">键</param>  /// <returns>返回的值</returns>  public string readIni(string Section, string Key){StringBuilder temp = new StringBuilder(10000);int i = GetPrivateProfileString(Section, Key, "", temp, 10000, this.iniPath);return temp.ToString();}/// <summary>  /// 读取section,不管section,默认从default里读取  /// </summary>  /// <param name="Key">键</param>  /// <returns>返回值</returns>  public string readIni(string Key){return readIni("default", Key);}/// <summary>  /// 查询ini文件是否存在  /// </summary>  /// <returns>是否存在</returns>  public bool existINIFile(){return File.Exists(iniPath);}
}
//Sample for simple winform
using NPOI.SS.UserModel;
using System;
using System.Windows.Forms;namespace OpicsPlus
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){IniFile ini = new IniFile(Application.StartupPath + @"\FINCTR1.INI");string importExcelPath = Application.StartupPath + @"\TEST.XLS";IWorkbook workbook = WorkbookFactory.Create(importExcelPath);ISheet sheet = workbook.GetSheetAt(workbook.GetSheetIndex("EXPORT"));int rowCount = sheet.LastRowNum;for (int i=0; i < rowCount;i++){IRow headerRow = (IRow)sheet.GetRow(i+1);String refBack = ini.readIni(headerRow.GetCell(1).StringCellValue, "SH");ini.writeIni(headerRow.GetCell(1).StringCellValue, "SH", refBack + " "+ headerRow.GetCell(0).NumericCellValue.ToString());}reArrStr("SHANGHAI");reArrStr("FRANKFURT");reArrStr("NEW YORK");reArrStr("LONDON");reArrStr("HONGKONG");reArrStr("TOKYO");MessageBox.Show("Done");}public void reArrStr(String sectName){IniFile ini = new IniFile(Application.StartupPath + @"\FINCTR1.INI");String refBack1 = ini.readIni(sectName, "SH");String strTemp = null;String[] strArr = refBack1.Split(new char[1] { ' ' });Array.Sort(strArr);for (int j = 0; j < strArr.Length; j++){if (j == 0){strTemp = strArr[j];}else{strTemp += " " + strArr[j];}}ini.writeIni(sectName, "SH", strTemp);}}
}

后序

至此,用技术手段解决了日常工作的小麻烦,作为一个IT老兵,还是很欣慰;在具体制作过程中还有一个小插曲,在核对过程中发现有一些日期在配置文件中有,但是并没有反应在系统中,对比数据后发现原来是数据的排序问题,由于是在原有数据的追加,所以特别在写入后,把全部数据再一次性读入数组进行一次排序。

OPICS 节假日维护相关推荐

  1. 汽车抵质押贷款系统-押品评估、登记、入库、出库、处理等标准化流程管理

    一.什么是汽车抵质押贷款 汽车抵质押贷款是指借款人将本人名下车辆抵质押给贷款机构,贷款机构获得车辆的所有权,按照借款人同意的条件向借款人发放贷款.借款人按照双方约定的还款方式和条件按期向贷款机构还款, ...

  2. 全面详细介绍一个P2P网贷领域的ERP系统的主要功能

    一般的P2P系统,至少包括PC网站的前端和后端.前端系统的功能,可以参考"P2P系统哪家强,功能其实都一样" http://blog.csdn.net/fansunion/arti ...

  3. 全面具体介绍一个P2P网贷领域的ERP系统的主要功能

    一般的P2P系统,至少包含PC站点的前端和后端.前端系统的功能.能够參考"P2P系统哪家强,功能事实上都一样" http://blog.csdn.net/fansunion/art ...

  4. 购车分期系统-智能风控体系,有效控制贷款风险

    一.购车分期业务简介 分期购车是指放款人根据借款人的申请,向借款人指定的经销商,按照借款人同意的条件,垫付借款人指定汽车的购车费用,借款人将汽车抵押给放款人,以借款人分期还款为条件,将该车辆的占有.使 ...

  5. lunar.js 基本使用学习笔记

    文章目录 lunar 基本使用学习笔记 介绍 基本使用 部分文档 API 转载 阳历相关的方法 API Solar 阳历 阳历实例化 阳历对象可以使用多种字符串输出方式: 获取年.月.日 儒略日 获取 ...

  6. java创建万年历,维护节假日信息

    最近工作中需要用到万年历的节假日信息.所以就建了一张日历表来维护节假日信息. 因为之后年份的节假日信息在当前年份是没办法确定的需要等节假日发布之后才可以,所以我每次就是获取当年的节假日,然后用日期自增 ...

  7. sql函数-创建计算工作日函数,除去了周末以及法定节假日,需要新建表做维护(内置本人有道云链接)

    这边创建新表维护是因为每年的法定节假日都不确认是什么时候,并且公司具体放假时间不确定(包括调休什么的) 表中数据主要存放节假日日期 1.新建节假日表 Holiday(三个字段如下) 数据结构: ID ...

  8. python获取节假日_用python获取表格中的节假日起始日期

    开发中遇到关于日期(节假日)的问题.具体情况:业务每天都会在系统中下载10张表,下载规则是今天下昨天的数据,意思就是下载时的查询条件日期那一栏应该写昨天的日期,但是有一个小问题,遇到周末就不能下昨天的 ...

  9. 动力专业节假日保障预案

    一.安全预防与预警机制 (一)预防预警信息 1.来自于上级部门的预防预警信息,包括集团公司.省公司.市分公司应急领导小组. 2.利用通信电源监控系统的日常运行数据的监测,及故障告警信息. 3.日常巡视 ...

  10. php根据当前日期判断法定节假日_判断日期是否为法定节假日的API接口与示例函数...

    需要判定某日期是否为法定节假日,由于国家的节假日每年都在变动,所以使用接口判定是必要的.可惜的是,这样的接口并不多,在此汇总三个: 前两个看起来是个人的,最后一个是聚合数据的万年历接口. 请注意,本文 ...

最新文章

  1. linux处理机调度实验报告,处理机调度试验
  2. ijkplayer-android框架详解
  3. lacp可以在access接口吗_【基础】防火墙接口类型全介绍
  4. electron 入坑记
  5. dj电商-需求分析-购物车模块与订单模块
  6. python中0o10_Python基础10—I/O编程
  7. Mysql数据表的操作
  8. mysql 时间 本周 本月_不要再等了,储蓄国债发行又被取消,本周还有两批国债能不能买...
  9. Python基础【day03】:字典(一)
  10. 机器视觉中使用光源及偏振镜解决物体反光问题
  11. 数据库锁表的分析与解决
  12. 使用RMAN恢复目录(catalog)解析
  13. react-native 解决“Could not get BatchedBridge...” 的问题
  14. pycharm关闭pytest模式
  15. 自动格式化SQL工具推荐
  16. IIS6同一IP部署多域名证书(部署指南)
  17. android 5.1 httpclient,【Android进阶学习】Http编程之HttpClient
  18. 狂神说Springboot
  19. 上门洗车小程序/APP功能介绍
  20. 卢卡斯定理扩展卢卡斯

热门文章

  1. python爬取京东商品信息_python爬虫:爬取京东商品信息
  2. 系统论重要模型_笔记
  3. matlab去除图片水印_利用MATLAB去除图片中的水印
  4. QT中on_pushButton_clicked()用法
  5. C# 斑马打印机USB接口实现打印各种类型的码
  6. matlab量化股票基本面,获取数据 - MATLAB - 掘金量化
  7. Android接入google地图
  8. iOS 打包流程教程
  9. 正点原子stm32F407 lcd.c 增加 画实心圆 函数
  10. 骁龙855音频解码芯片_小米10、小10 Pro详细对比:骁龙865最强悍5G旗舰手机