lrf преди 8 месеца
родител
ревизия
f95030e593
променени са 5 файла, в които са добавени 52 реда и са изтрити 25 реда
  1. 4 0
      README.md
  2. 6 18
      src/controller/home.controller.ts
  3. 39 5
      src/frame/BaseServiceV2.ts
  4. 2 0
      src/frame/dbOpera.ts
  5. 1 2
      src/service/system/message.service.ts

+ 4 - 0
README.md

@@ -23,6 +23,10 @@
     object: {test:'123'}
     JSONB_CONTAINS(column, :val)', { val: { test: '123' } }
     ```
+    ```
+    Array<object>
+    where "${root_column}" @> '[{"${key}": ${value} }]'
+    ```
     导致文档模式查询会变得不可能,所以使用JSONB数据格式的情况,只有准确查询;
     将文档模式的设计变成表关联,联查出来
 

+ 6 - 18
src/controller/home.controller.ts

@@ -7,6 +7,7 @@ import { InitThreeService } from '../service/initData/initThree.service';
 import { DataDealService } from '../service/initData/dataDeal.service';
 import { TestsService } from '../service/tests.service';
 import { ESService } from '../service/elasticsearch/es.service';
+import { Opera } from '../frame/dbOpera';
 @Controller('/')
 export class HomeController {
   @Inject()
@@ -26,9 +27,11 @@ export class HomeController {
   @Inject()
   esService: ESService;
 
+  Opera = Opera;
+
   @Get('/')
   async home(@Query() query: object): Promise<any> {
-    await this.esService.initES()
+    // await this.esService.initES()
     // await this.dataDealService.initUserMenus();
     // await this.dataDealService.initRoleMenus();
     // await this.oneService.addTags();
@@ -43,23 +46,8 @@ export class HomeController {
     // await this.threeService.import2024Company();
     // await this.threeService.importMatching();
     // await this.dataDealService.JsonbAddDefault();
-    // const sq = {
-    //   // time: ['2024-01-01', '2025-01-01'],
-    //   // nick_name: '2024',
-    //   // account: '2024',
-    //   // age: [40, 10],
-    //   // data_owner: '',
-    //   // tags: '黑奴'
-    // };
-    // const operas = {
-    //   id: Opera.Not,
-    //   time: Opera.Between,
-    //   nick_name: Opera.ILikeRight,
-    //   account: Opera.LikeRight,
-    //   age: Opera.In,
-    //   data_owner: Opera.IsNotNull,
-    //   tags: Opera.Json,
-    // };
+    // const sq = { 'props.hobby': '睡觉1' };
+    // const operas = { 'props.hobby': Opera.JsonObject };
     // const res = await this.testService.query(sq, null, operas);
     // const body = {
     //   nick_name: '测试20240806_1',

+ 39 - 5
src/frame/BaseServiceV2.ts

@@ -1,6 +1,6 @@
 import { App, Inject, MidwayWebRouterService } from '@midwayjs/core';
 import { Application, Context } from '@midwayjs/koa';
-import { compact, flattenDeep, get, head, isArray, isNull, isNumber, isObject, isString, isUndefined, last, uniq } from 'lodash';
+import { compact, flattenDeep, get, head, isArray, isNull, isObject, isFinite, isString, isUndefined, last, uniq } from 'lodash';
 import { Opera } from './dbOpera';
 import { Opera as operaModel } from '../entityLogs/opera.entity';
 import dayjs = require('dayjs');
@@ -69,12 +69,12 @@ export abstract class BaseServiceV2 {
     // 分页
     if (isString(skip)) {
       skip = parseInt(skip);
-      if (isNumber(skip)) builder.skip(skip);
-    } else if (isNumber(skip)) builder.skip(skip);
+      if (isFinite(skip)) builder.skip(skip);
+    } else if (isFinite(skip)) builder.skip(skip);
     if (isString(limit)) {
       limit = parseInt(limit);
-      if (isNumber(limit)) builder.take(limit);
-    } else if (isNumber(limit)) builder.take(limit);
+      if (isFinite(limit)) builder.take(limit);
+    } else if (isFinite(limit)) builder.take(limit);
     // 排序
     builder.orderBy(orderObject);
     // 执行
@@ -187,6 +187,40 @@ export abstract class BaseServiceV2 {
           }
           str = `(${strArr.join(' OR ')})`;
           break;
+        case this.Opera.JsonObject:
+          const jokeys = key.split('.');
+          let jorootCol = head(jokeys);
+          let jolastKey = last(jokeys);
+          let jopath = jokeys.filter(f => f !== jorootCol && f !== jolastKey);
+          str = `"${jorootCol}" `
+          for (const jok of jopath) {
+            str = `${str} -> ${jok}`
+          }
+          str = `${str} ->> '${jolastKey}' = :${valueStr}`
+          params = { [`${valueStr}`]: value };
+          break;
+        case this.Opera.JsonArrayObject:
+          /**
+           * 1.分割key,过来的属性默认以 x.y.z... 形式
+           * x:根子段;后面,数组中依次往下的属性名
+           */
+          const keys = key.split('.');
+          let newValue = value;
+          if (isFinite(parseInt(newValue))) newValue = parseInt(value);
+          let rootCol = head(keys);
+          let lastKey = last(keys);
+          let path = keys.filter(f => f !== rootCol && f !== lastKey);
+          let obj = {};
+          let mid = obj;
+          for (const k of path) {
+            mid[k] = {};
+            mid = mid[k];
+          }
+          mid[lastKey] = newValue;
+          let newVal = JSON.stringify([obj]);
+          str = `"${rootCol}" @> :${valueStr}`;
+          params = { [`${valueStr}`]: newVal };
+          break;
         case this.Opera.Equal:
         default:
           str = `"${key}" = :${valueStr}`;

+ 2 - 0
src/frame/dbOpera.ts

@@ -31,4 +31,6 @@ export enum Opera {
   /**JSON */
   Json = 'Json',
   /**Json, Object类型需要自定义写法 */
+  JsonArrayObject = 'JsonArrayObject',
+  JsonObject = 'JsonObject',
 }

+ 1 - 2
src/service/system/message.service.ts

@@ -9,7 +9,6 @@ export class MessageService extends BaseServiceV2 {
   @InjectEntityModel(Message)
   model: Repository<Message>;
   getQueryColumnsOpera() {
-    // return { 'to.user': this.Opera.JsonObject };
-    return {}
+    return { 'to.user': this.Opera.JsonArrayObject };
   }
 }