comparison src/kaigo/qtuti/95_tmpl.go @ 61:49656dc40069

add qtuti.
author pyon@macmini
date Fri, 11 Sep 2020 20:06:27 +0900
parents
children
comparison
equal deleted inserted replaced
60:058fb0a2cda8 61:49656dc40069
1 /*
2 95.go: Qfuhi Tsuchi
3
4 Last Change: 2020-09-11 金 10:42:16.
5 */
6
7 package main
8
9 /*
10 #cgo LDFLAGS: -L. -lxdwapi -static
11 ##### C_SOURCE #####
12 */
13 import "C"
14
15 import (
16 "bufio"
17 "regexp"
18 "encoding/json"
19 "flag"
20 "fmt"
21 "io/ioutil"
22 "log"
23 "os"
24 "path/filepath"
25 "sort"
26 "strings"
27
28 "golang.org/x/text/encoding/japanese"
29 "golang.org/x/text/transform"
30 )
31
32 type Hhs struct {
33 No string
34 Name string
35 Page int // sinsei page
36 Tsuchi bool
37 Kaigo string
38 Xdw []string
39 }
40
41 func(h *Hhs) AppendXdw(xdw string) {
42 h.Xdw = append(h.Xdw, xdw)
43 }
44
45 func(h *Hhs) CsvString() string {
46 q := ""
47 if h.Tsuchi {
48 q = "○"
49 }
50 k := strings.Split(h.Kaigo, "")
51 return strings.Join([]string{h.No, h.Name, q, k[1] + k[3]}, ",")
52 }
53
54 func(h *Hhs) Dump() string {
55 q := "false"
56 if h.Tsuchi {
57 q = "true"
58 }
59 p := fmt.Sprintf("%05d", h.Page)
60 x := strings.Join(h.Xdw, ",")
61 return strings.Join([]string{h.No, h.Name, q, h.Kaigo, p, x}, ",")
62 }
63
64 type Config struct {
65 Indir string
66 Outdir string
67 Workdir string
68 Hhsdb string
69 Atnfile[] string
70 }
71
72 var (
73 ver = "0.1"
74 conf Config
75 confjson = "95.json"
76 logfile = "95.log"
77 osirase = "KBPA316G.xdw"
78 sinsei = "KBPA406G.xdw"
79 rule_s = "rules.ann"
80
81 out_o = "o.xdw"
82 out_s = "s.xdw"
83 out_q = "q.xdw"
84 out_l = "l.csv"
85
86 re_hhsno, re_name, re_kaigo *regexp.Regexp
87
88 // option parameters
89 version bool
90 )
91
92 func init() {
93 /* コンフィグファイルは JSON */
94 content, err := ioutil.ReadFile(confjson)
95 if err != nil {
96 log.Fatal(err)
97 }
98 if err := json.Unmarshal(content, &conf); err != nil {
99 log.Fatal(err)
100 }
101
102 osirase = filepath.Join(conf.Indir, osirase)
103 sinsei = filepath.Join(conf.Indir, sinsei)
104
105 out_o = filepath.Join(conf.Outdir, out_o)
106 out_s = filepath.Join(conf.Outdir, out_s)
107 out_q = filepath.Join(conf.Outdir, out_q)
108 out_l = filepath.Join(conf.Outdir, out_l)
109
110 logfile = filepath.Join(conf.Workdir, logfile)
111
112 /* 一時ファイル消去 */
113 os.RemoveAll(conf.Outdir)
114 os.RemoveAll(conf.Workdir)
115 os.Mkdir(conf.Outdir, 0755)
116 os.Mkdir(conf.Workdir, 0755)
117
118 /* 変数初期化 */
119 re_hhsno = regexp.MustCompile(`0[1238]00\d{6}`)
120 re_name = regexp.MustCompile(`日.{30}`)
121 re_kaigo = regexp.MustCompile(`要((介護)|(支援)).`)
122
123 flag.BoolVar(&version, "v", false, "print version")
124 }
125
126 func main() {
127 flag.Parse()
128
129 if version {
130 fmt.Println("95 - version", ver)
131 os.Exit(0)
132 }
133
134 hash_Hhs := make(map[string]Hhs)
135
136 /* 申請書を漁り,構造体を初期化 */
137 for p, t := range xdw2txt(sinsei) {
138 hno := re_hhsno.FindString(t)
139 name := re_name.FindString(t)
140 name = strings.Replace(name, "日", "", 1)
141 kaigo := re_kaigo.FindString(t)
142 o := fmt.Sprintf("o_%05d.xdw", p + 1)
143 s := fmt.Sprintf("s_%05d.xdw", p + 1)
144 h := Hhs{No: hno, Name: name, Kaigo: kaigo, Page:p + 1, Xdw: []string{o, s}}
145 hash_Hhs[hno] = h
146 }
147
148 /* バックグラウンドで給付費通知から勧奨対象者を抽出 */
149 ch := make(chan int)
150 go func() {
151 files, err := ioutil.ReadDir(conf.Indir)
152 if err != nil {
153 log.Fatal(err)
154 }
155
156 qn := 1
157 for _, file := range files {
158 if !strings.HasSuffix(file.Name(), ".xdw") {
159 continue
160 }
161 if strings.HasPrefix(file.Name(), "KDPK016G") || strings.HasPrefix(file.Name(), "KDPK126G") {
162 qtsuchi := filepath.Join(conf.Indir, file.Name())
163 tmptxt := filepath.Join(conf.Workdir, "tmp95.txt")
164 for p, t := range xdw2txtb(qtsuchi, tmptxt) {
165 hno := re_hhsno.FindString(t)
166 if h, ok := hash_Hhs[hno]; ok {
167 h.Tsuchi = true
168 q := fmt.Sprintf("q_%05d.xdw", qn)
169 h.AppendXdw(q)
170 hash_Hhs[hno] = h
171 q = filepath.Join(conf.Workdir, q)
172 C.xdwextpage(C.CString(qtsuchi), C.int(p + 1), C.CString(q))
173 qn++
174 //fmt.Println(qtsuchi, p, hno, h.Kaigo, h.Xdw)
175 }
176 }
177 }
178 }
179
180 ch <- 1
181 }()
182
183 /* そのあいだにバラす */
184 C.xdwsplit1(C.CString(osirase), C.CString(conf.Workdir), C.CString("o_"))
185 C.xdwsplit1(C.CString(sinsei), C.CString(conf.Workdir), C.CString("s_"))
186 <-ch
187
188 /* ソート & マージ */
189 var slice_Hhs []Hhs
190 for _, h := range hash_Hhs {
191 slice_Hhs = append(slice_Hhs, h)
192 }
193 sort.Slice(slice_Hhs, func(i, j int) bool {
194 if slice_Hhs[i].Tsuchi != slice_Hhs[j].Tsuchi {
195 return slice_Hhs[i].Tsuchi
196 }
197 if slice_Hhs[i].Kaigo != slice_Hhs[j].Kaigo {
198 return slice_Hhs[i].Kaigo < slice_Hhs[j].Kaigo
199 }
200 if slice_Hhs[i].Page != slice_Hhs[j].Page {
201 return slice_Hhs[i].Page < slice_Hhs[j].Page
202 }
203 return false
204 })
205
206 var list_o, list_s, list_q []string
207 for _, h := range slice_Hhs {
208 list_o = append(list_o, filepath.Join(conf.Workdir, h.Xdw[0]))
209 list_s = append(list_s, filepath.Join(conf.Workdir, h.Xdw[1]))
210 if h.Tsuchi {
211 for i, x := range h.Xdw {
212 if i > 1 {
213 buf := filepath.Join(conf.Workdir, x)
214 list_q = append(list_q, buf)
215 }
216 }
217 }
218 }
219 xdwmerge(list_o, out_o)
220 xdwmerge(list_s, out_s)
221 xdwmerge(list_q, out_q)
222
223 /* リスト出力 & ログダンプ */
224 csvtxt := ""
225 logtxt := ""
226 for _, h := range slice_Hhs {
227 csvtxt += h.CsvString() + "\n"
228 logtxt += h.Dump() + "\n"
229 }
230 csvtxt, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), csvtxt)
231 if err := ioutil.WriteFile(out_l, []byte(csvtxt), 0644); err != nil {
232 log.Fatal(err)
233 }
234 if err := ioutil.WriteFile(logfile, []byte(logtxt), 0644); err != nil {
235 log.Fatal(err)
236 }
237
238 /* バックグラウンドで給付費通知を校正 */
239 ch2 := make(chan int)
240 go func() {
241 for _, a := range conf.Atnfile {
242 xdwaddatn(out_q, a)
243 }
244 ch2 <- 1
245 } ()
246
247 /* そのあいだに申請書に枠付け */
248 xdwaddatntool(out_s, rule_s, 2, 1497, 803)
249 <-ch2
250 }
251
252 func xdw2txt(file string) (txt []string) {
253 s := C.GoString(C.xdw2txt(C.CString(file)))
254 r := strings.NewReader(s)
255 tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder())
256 buf := bufio.NewScanner(tr)
257 for buf.Scan() {
258 txt = append(txt, buf.Text())
259 }
260 return
261 }
262
263 func xdw2txtb(xdwfile, txtfile string) (txt []string) {
264 if _, err := os.Stat(txtfile); os.IsExist(err) {
265 os.Remove(txtfile)
266 }
267
268 C.xdw2txtb(C.CString(xdwfile), C.CString(txtfile))
269 content, err := ioutil.ReadFile(txtfile)
270 if err != nil {
271 return nil
272 }
273
274 r := strings.NewReader(string(content))
275 tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder())
276 buf := bufio.NewScanner(tr)
277 for buf.Scan() {
278 txt = append(txt, buf.Text())
279 }
280 return
281 }
282
283 func xdwmerge(list []string, outfile string) (err error) {
284 order := strings.Join(list, "\n")
285 order, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), order)
286 orderfile := filepath.Join(conf.Workdir, "order95.txt")
287 if err := ioutil.WriteFile(orderfile, []byte(order), 0644); err != nil {
288 return err
289 }
290 C.xdwmerge(C.CString(orderfile), C.CString(outfile))
291 return nil
292 }
293
294 func xdwaddatn(xdwfile, atnfile string) (err error) {
295 C.xdwaddatn(C.CString(xdwfile), C.CString(atnfile))
296 return nil
297 }
298
299 func xdwaddatntool(xdwfile, toolfile string, n, x, y int) (err error) {
300 C.xdwaddatntool(C.CString(xdwfile), C.CString(toolfile), C.int(n), C.int(x), C.int(y))
301 return nil
302 }
303