Mercurial > mercurial > hgweb_golang.cgi
diff src/kaigo/qtuti/95_tmpl.go @ 61:49656dc40069
add qtuti.
author | pyon@macmini |
---|---|
date | Fri, 11 Sep 2020 20:06:27 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/kaigo/qtuti/95_tmpl.go Fri Sep 11 20:06:27 2020 +0900 @@ -0,0 +1,303 @@ +/* + 95.go: Qfuhi Tsuchi + + Last Change: 2020-09-11 金 10:42:16. +*/ + +package main + +/* +#cgo LDFLAGS: -L. -lxdwapi -static +##### C_SOURCE ##### +*/ +import "C" + +import ( + "bufio" + "regexp" + "encoding/json" + "flag" + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + "sort" + "strings" + + "golang.org/x/text/encoding/japanese" + "golang.org/x/text/transform" +) + +type Hhs struct { + No string + Name string + Page int // sinsei page + Tsuchi bool + Kaigo string + Xdw []string +} + +func(h *Hhs) AppendXdw(xdw string) { + h.Xdw = append(h.Xdw, xdw) +} + +func(h *Hhs) CsvString() string { + q := "" + if h.Tsuchi { + q = "○" + } + k := strings.Split(h.Kaigo, "") + return strings.Join([]string{h.No, h.Name, q, k[1] + k[3]}, ",") +} + +func(h *Hhs) Dump() string { + q := "false" + if h.Tsuchi { + q = "true" + } + p := fmt.Sprintf("%05d", h.Page) + x := strings.Join(h.Xdw, ",") + return strings.Join([]string{h.No, h.Name, q, h.Kaigo, p, x}, ",") +} + +type Config struct { + Indir string + Outdir string + Workdir string + Hhsdb string + Atnfile[] string +} + +var ( + ver = "0.1" + conf Config + confjson = "95.json" + logfile = "95.log" + osirase = "KBPA316G.xdw" + sinsei = "KBPA406G.xdw" + rule_s = "rules.ann" + + out_o = "o.xdw" + out_s = "s.xdw" + out_q = "q.xdw" + out_l = "l.csv" + + re_hhsno, re_name, re_kaigo *regexp.Regexp + + // option parameters + version bool +) + +func init() { + /* コンフィグファイルは JSON */ + content, err := ioutil.ReadFile(confjson) + if err != nil { + log.Fatal(err) + } + if err := json.Unmarshal(content, &conf); err != nil { + log.Fatal(err) + } + + osirase = filepath.Join(conf.Indir, osirase) + sinsei = filepath.Join(conf.Indir, sinsei) + + out_o = filepath.Join(conf.Outdir, out_o) + out_s = filepath.Join(conf.Outdir, out_s) + out_q = filepath.Join(conf.Outdir, out_q) + out_l = filepath.Join(conf.Outdir, out_l) + + logfile = filepath.Join(conf.Workdir, logfile) + + /* 一時ファイル消去 */ + os.RemoveAll(conf.Outdir) + os.RemoveAll(conf.Workdir) + os.Mkdir(conf.Outdir, 0755) + os.Mkdir(conf.Workdir, 0755) + + /* 変数初期化 */ + re_hhsno = regexp.MustCompile(`0[1238]00\d{6}`) + re_name = regexp.MustCompile(`日.{30}`) + re_kaigo = regexp.MustCompile(`要((介護)|(支援)).`) + + flag.BoolVar(&version, "v", false, "print version") +} + +func main() { + flag.Parse() + + if version { + fmt.Println("95 - version", ver) + os.Exit(0) + } + + hash_Hhs := make(map[string]Hhs) + + /* 申請書を漁り,構造体を初期化 */ + for p, t := range xdw2txt(sinsei) { + hno := re_hhsno.FindString(t) + name := re_name.FindString(t) + name = strings.Replace(name, "日", "", 1) + kaigo := re_kaigo.FindString(t) + o := fmt.Sprintf("o_%05d.xdw", p + 1) + s := fmt.Sprintf("s_%05d.xdw", p + 1) + h := Hhs{No: hno, Name: name, Kaigo: kaigo, Page:p + 1, Xdw: []string{o, s}} + hash_Hhs[hno] = h + } + + /* バックグラウンドで給付費通知から勧奨対象者を抽出 */ + ch := make(chan int) + go func() { + files, err := ioutil.ReadDir(conf.Indir) + if err != nil { + log.Fatal(err) + } + + qn := 1 + for _, file := range files { + if !strings.HasSuffix(file.Name(), ".xdw") { + continue + } + if strings.HasPrefix(file.Name(), "KDPK016G") || strings.HasPrefix(file.Name(), "KDPK126G") { + qtsuchi := filepath.Join(conf.Indir, file.Name()) + tmptxt := filepath.Join(conf.Workdir, "tmp95.txt") + for p, t := range xdw2txtb(qtsuchi, tmptxt) { + hno := re_hhsno.FindString(t) + if h, ok := hash_Hhs[hno]; ok { + h.Tsuchi = true + q := fmt.Sprintf("q_%05d.xdw", qn) + h.AppendXdw(q) + hash_Hhs[hno] = h + q = filepath.Join(conf.Workdir, q) + C.xdwextpage(C.CString(qtsuchi), C.int(p + 1), C.CString(q)) + qn++ + //fmt.Println(qtsuchi, p, hno, h.Kaigo, h.Xdw) + } + } + } + } + + ch <- 1 + }() + + /* そのあいだにバラす */ + C.xdwsplit1(C.CString(osirase), C.CString(conf.Workdir), C.CString("o_")) + C.xdwsplit1(C.CString(sinsei), C.CString(conf.Workdir), C.CString("s_")) + <-ch + + /* ソート & マージ */ + var slice_Hhs []Hhs + for _, h := range hash_Hhs { + slice_Hhs = append(slice_Hhs, h) + } + sort.Slice(slice_Hhs, func(i, j int) bool { + if slice_Hhs[i].Tsuchi != slice_Hhs[j].Tsuchi { + return slice_Hhs[i].Tsuchi + } + if slice_Hhs[i].Kaigo != slice_Hhs[j].Kaigo { + return slice_Hhs[i].Kaigo < slice_Hhs[j].Kaigo + } + if slice_Hhs[i].Page != slice_Hhs[j].Page { + return slice_Hhs[i].Page < slice_Hhs[j].Page + } + return false + }) + + var list_o, list_s, list_q []string + for _, h := range slice_Hhs { + list_o = append(list_o, filepath.Join(conf.Workdir, h.Xdw[0])) + list_s = append(list_s, filepath.Join(conf.Workdir, h.Xdw[1])) + if h.Tsuchi { + for i, x := range h.Xdw { + if i > 1 { + buf := filepath.Join(conf.Workdir, x) + list_q = append(list_q, buf) + } + } + } + } + xdwmerge(list_o, out_o) + xdwmerge(list_s, out_s) + xdwmerge(list_q, out_q) + + /* リスト出力 & ログダンプ */ + csvtxt := "" + logtxt := "" + for _, h := range slice_Hhs { + csvtxt += h.CsvString() + "\n" + logtxt += h.Dump() + "\n" + } + csvtxt, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), csvtxt) + if err := ioutil.WriteFile(out_l, []byte(csvtxt), 0644); err != nil { + log.Fatal(err) + } + if err := ioutil.WriteFile(logfile, []byte(logtxt), 0644); err != nil { + log.Fatal(err) + } + + /* バックグラウンドで給付費通知を校正 */ + ch2 := make(chan int) + go func() { + for _, a := range conf.Atnfile { + xdwaddatn(out_q, a) + } + ch2 <- 1 + } () + + /* そのあいだに申請書に枠付け */ + xdwaddatntool(out_s, rule_s, 2, 1497, 803) + <-ch2 +} + +func xdw2txt(file string) (txt []string) { + s := C.GoString(C.xdw2txt(C.CString(file))) + r := strings.NewReader(s) + tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder()) + buf := bufio.NewScanner(tr) + for buf.Scan() { + txt = append(txt, buf.Text()) + } + return +} + +func xdw2txtb(xdwfile, txtfile string) (txt []string) { + if _, err := os.Stat(txtfile); os.IsExist(err) { + os.Remove(txtfile) + } + + C.xdw2txtb(C.CString(xdwfile), C.CString(txtfile)) + content, err := ioutil.ReadFile(txtfile) + if err != nil { + return nil + } + + r := strings.NewReader(string(content)) + tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder()) + buf := bufio.NewScanner(tr) + for buf.Scan() { + txt = append(txt, buf.Text()) + } + return +} + +func xdwmerge(list []string, outfile string) (err error) { + order := strings.Join(list, "\n") + order, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), order) + orderfile := filepath.Join(conf.Workdir, "order95.txt") + if err := ioutil.WriteFile(orderfile, []byte(order), 0644); err != nil { + return err + } + C.xdwmerge(C.CString(orderfile), C.CString(outfile)) + return nil +} + +func xdwaddatn(xdwfile, atnfile string) (err error) { + C.xdwaddatn(C.CString(xdwfile), C.CString(atnfile)) + return nil +} + +func xdwaddatntool(xdwfile, toolfile string, n, x, y int) (err error) { + C.xdwaddatntool(C.CString(xdwfile), C.CString(toolfile), C.int(n), C.int(x), C.int(y)) + return nil +} +