zhaoxing
2022-08-22 74bb50ce93d0c9cd20a0b84f63db46f433a39e91
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
// 存放一些通用方法
 
/**
 * 拼接数组
 * @param values 待拼接数组
 * @param separator 分隔符
 */
let array_connect = function(values, separator) {
  if (values.length) {
    let str = ''
    for (var idx in values) {
      str += `'${values[idx]}'${separator}`
    }
    return str.substring(0, str.length - 1)
  } else {
    return ''
  }
}
 
/**
 * 生成where条件
 * @param options 条件集合,类型为json数组;每一个条件为一个单独的json对象,包括3个key
 * 即"type"、"name"、"value";type为字符型,取值及含义为 "1":等于,"2":小于,"3":大于,
 * "12": 小于等于, "13": 大于等于, "4": between, "5": not between, "6": in ,"7": not in ;
 * name为字段名; value为值, 当且仅当type为4、 5、 6 ,7时, 以数组形式保存;
 * "8":模糊查询
 * value的值如果为字符串,需要用引号括起来
 * @param operator 条件连接运算符“ AND” 或者“ OR”
 */
let create_whereclause = function(options, operator) {
  if (!operator) {
    operator = 'AND'
  }
  if (options && options.length > 0) {
    let str = ''
    for (var idx in options) {
      str += `${operator} ${options[idx]['name']} `
      switch (options[idx]['type']) {
        case '1':
          str += ` = '${options[idx]['value']}' `
          break
        case '2':
          str += ` < '${options[idx]['value']}'' `
          break
        case '3':
          str += ` > '${options[idx]['value']}'' `
          break
        case '12':
          str += ` <= '${options[idx]['value']}'' `
          break
        case '13':
          str += ` >= '${options[idx]['value']}'' `
          break
        case '4':
          str += ` BETWEEN '${options[idx]['value'][0]}' AND '${
            options[idx]['value'][1]
          }' `
          break
        case '5':
          str += ` NOT BETWEEN '${options[idx]['value'][0]}' AND '${
            options[idx]['value'][1]
          }' `
          break
        case '6':
          str += ` IN (${array_connect(options[idx]['value'], ',')}) `
          break
        case '7':
          str += `NOT IN (${array_connect(options[idx]['value'], ',')}) `
          break
        case '8':
          str += ` LIKE '%${options[idx]['value']}%' `
          break
        case '9':
          str += ` is null `
          break
        case '10':
          str += ` is not null `
          break
      }
    }
    return ` WHERE ${str.substring(operator.length)} ` //去掉第一个元素前的条件连接符
  } else {
    return ' '
  }
}
 
/**
 * 生成order by语句
 * @param {JSON} orderby "{"fieldname1":"ASC","fieldname2":"DESC",...}"
 */
let create_orderby = function(orderby) {
  if (orderby) {
    let rst = ''
    let connector = ','
    for (let key in orderby) {
      rst = `${connector}${key} ${orderby[key]}`
    }
    return ` ORDER BY ${rst.substring(connector.length)} `
  } else {
    return ' '
  }
}
 
let create_limit = function(rows_per_page, current_page) {
  if (rows_per_page && current_page) {
    return ` LIMIT ${rows_per_page * (current_page - 1)},${rows_per_page} `
  } else {
    return ' '
  }
}
 
/**
 * 生成select语句
 * @param {String} table
 * @param {Array<String>} fields
 * @param {Array<JSON>} options where条件
 * @param {String} operator 条件连接符:"AND"或者"OR"
 * @param {JSON} orderby 排序 {"fieldname1":"ASC","fieldname2":"DESC",...}
 * @param {Number} rows_per_page 每页行数
 * @param {Number} current_page 当前页码
 */
let create_sql_select = function(
  table,
  fields,
  options,
  operator,
  orderby,
  rows_per_page,
  current_page
) {
  return `
  SELECT ${fields ? array_connect(fields, ',') : '*'} 
  FROM ${table} 
  ${create_whereclause(options, operator)} 
  ${create_orderby(orderby)} 
  ${create_limit(rows_per_page, current_page)}`
}
 
/**
 * 生成select语句 [sql_count、sql]
 * @param {Object} obj select_ from_ where_ order_ server_paging pageindex_ pagesize_
 */
 let create_sql = function(obj,pageindex_,pagesize_) {
  let str_select_ = [];
  let str_select_count = [];  
  str_select_.push(obj.select_ + obj.from_ + obj.where_ + obj.order_);
  str_select_count.push('select count(1) as counter'+obj.from_ + obj.where_ + obj.order_);
  if (obj.server_paging == '1') {
    let pageindex = Number.isNaN(Number(pageindex_)) ? Number(pageindex_) : 1;
    let pagesize = Number.isNaN(Number(pagesize_)) ? Number(pagesize_) : 10;
    str_select_.push(' limit ').push((pageindex-1)*pagesize).push(', ').push(pagesize);
  }
  return [str_select_count.join(''),str_select_.join('')]
}
 
/**
 * 生成select语句 [sql_count、sql]
 * @param {Object} obj select_ from_ where_ order_ server_paging pageindex_ pagesize_
 */
 let create_sync_sql = function(obj) {
  let str_select_ = [];
  let str_sync = [];  
  str_select_.push(obj.select_ + obj.from_ + obj.where_ + obj.order_);
  str_sync.push('replace into ');
  str_sync.push(obj.table_name);
  return [str_select_.join(''),str_sync.join('')]
}
 
let date_format = function(date_str, format) {
  // = 'YY-MM-DD hh:mm:ss'
  let date = new Date(date_str)
 
  let year = date.getFullYear(),
    month = date.getMonth() + 1, //月份是从0开始的
    day = date.getDate(),
    hour = date.getHours(),
    min = date.getMinutes(),
    sec = date.getSeconds()
  let preArr = Array.apply(null, Array(10)).map(function(elem, index) {
    return '0' + index
  }) ////开个长度为10的数组 格式为 00 01 02 03
 
  let newTime = format
    .replace(/YY/g, year)
    .replace(/MM/g, preArr[month] || month)
    .replace(/DD/g, preArr[day] || day)
    .replace(/hh/g, preArr[hour] || hour)
    .replace(/mm/g, preArr[min] || min)
    .replace(/ss/g, preArr[sec] || sec)
 
  return newTime
}
 
/**
 * 当月第一天和最后一天
 * @param {*} date
 */
let month_first_end = function(date) {
  let M = typeof date == 'undefined' ? new Date() : date.getMonth()
  let Y = typeof date == 'undefined' ? new Date() : date.getFullYear()
  let day = new Date(Y, M + 1, 0).getDate()
  let enddate = new Date(Y, M, day)
  let result = {
    start: date_format(new Date(Y, M, 1), 'YY-MM-DD'),
    end: date_format(enddate, 'YY-MM-DD')
  }
 
  return result
}
 
module.exports = {
  create_sql,
  create_sql_select,
  create_sync_sql,
  array_connect,
  create_whereclause,
  create_orderby,
  create_limit,
  date_format,
  month_first_end,
}