jt
2024-03-14 db95b21bd883df9cbbad97d86bb8e94709ffa312
pages/modal/3200_view.vue
@@ -105,6 +105,7 @@
  font-size: 34rpx;
  text-align: right;
  display: inline-block;
  margin-bottom: 15rpx;
}
.dv-panel input{
   vertical-align: middle;
@@ -149,11 +150,13 @@
   padding: 0 12px;
}
.view-floor{
   text-align: center;
   padding: 0 20rpx;
   margin-top: 25rpx;
   /* border:1px solid red; */
}
button.btn_refresh {
   width:49.5%;
   width:48%;
   margin-top: 25rpx;
   padding: 20rpx;
   line-height: 1.5;
@@ -162,8 +165,9 @@
   color: #fff;
    font-size: 38rpx;
   font-weight: bold;
   float: left;
   /* float: left; */
   display: inline-block;
   margin: 0 3px;
}
button.btn_cancel {
   width:49.5%;
@@ -184,7 +188,7 @@
  background-color: #D6FCB2;
}
.uni-padding-wrap{
  margin-top: 14rpx;
  margin-top: -4rpx;
  background-color: #98DAEA;
  width: 52px;
  height: 40px;
@@ -228,13 +232,13 @@
              <!-- 普通布局 -->
              <view v-if="item.name!='Layout'">
                 <text class="txt_title" :style="{'width':item.labelWidth+'px'}">{{item.label}}:</text>
                 <span class="form-item-span" v-if="item.disabled">{{item.value}}</span>
                 <span class="form-item-span" v-if="item.disabled">{{item.value2?'#'+item.value+'#'+item.value2:item.value}}</span>
                 <!-- 文本框/数字框 -->
                 <view class="dv_input" v-if="(item.name=='Input' || item.name=='InputNumber') && !item.disabled">
                    <text v-if="item.setting.prefix" 
                       class="uni-icon" 
                       :class="[item.setting.prefix]"
                       @change="onchange(item)">&#xe568;</text>
                       @change="onChange(item)">&#xe568;</text>
                    <input class="uni-input" :class="item.disabled?'input-disabled':''" 
                       :type="item.name=='Input'?'text':item.name=='InputNumber'?'number':'text'" 
                       v-model="item.value"
@@ -248,14 +252,14 @@
                    <text v-if="item.setting.suffix" 
                       class="uni-icon" 
                       :class="[item.setting.suffix]"
                       @click="onchange(item)">&#xe568;</text>
                       @click="onChange(item)">&#xe568;</text>
                 </view>
                 <!-- 下拉框-单选 item.useDict?item.dict:item.selections-->
                 <uni-data-select id="dv_select" v-if="item.name=='Select' && !item.disabled"
                    :class="item.disabled?'input-disabled':''" 
                    v-model="item.value"
                    :localdata="item.dict"
                    @change="onchange(item)"
                    @change="onChange(item)"
                    :disabled="item.disabled"
                    :clear="false"
                 ></uni-data-select>
@@ -305,12 +309,12 @@
                    :span="item.setting.spanList?item.setting.spanList[key]:24 / item.setting.col">
                    <view v-if="cols!=null" >
                       <text class="txt_title" :style="{'width':cols.labelWidth+'px'}">{{cols.label}}:</text>
                       <span class="form-item-span" v-if="cols.disabled">{{cols.value}}</span>
                       <span class="form-item-span" v-if="cols.disabled">{{cols.value2?'#'+cols.value+'#'+cols.value2:cols.value}}</span>
                       <view class="dv_input" v-if="(cols.name=='Input' || cols.name=='InputNumber') && !cols.disabled">
                          <text v-if="cols.setting.prefix" 
                             class="uni-icon" 
                             :class="[cols.setting.prefix]"
                             @change="onchange(cols)">&#xe568;</text>
                             @change="onChange(cols)">&#xe568;</text>
                          <input class="uni-input" :class="cols.disabled?'input-disabled':''" 
                             :type="cols.name=='Input'?'text':cols.name=='InputNumber'?'number':'text'" 
                             v-model="cols.value"
@@ -324,14 +328,14 @@
                          <text v-if="cols.setting.suffix" 
                             class="uni-icon" 
                             :class="[cols.setting.suffix]"
                             @click="onchange(cols)">&#xe568;</text>
                             @click="onChange(cols)">&#xe568;</text>
                       </view>
                       <!-- 下拉框-单选 cols.useDict?cols.dict:cols.selections-->
                       <uni-data-select id="dv_select" v-if="cols.name=='Select' && !cols.disabled"
                          :class="cols.disabled?'input-disabled':''" 
                          v-model="cols.value"
                          :localdata="cols.dict"
                          @change="onchange(cols)"
                          @change="onChange(cols)"
                          :disabled="cols.disabled"
                          :clear="false"
                       ></uni-data-select>
@@ -383,19 +387,19 @@
      </view>
     </view>
      
     <view class="view-floor">
        <button type="default" @click="cancel" class="btn_cancel"
        :style="{'width':param.ViewPage.Page_Button.length>1?'39.5%':'48.5%'}">返回</button>
      <view v-if="param.ViewPage.Page_Button">
         <button type="default" class="btn_refresh" @click="onBtnClick(param.ViewPage.Page_Button[0])"
           :style="{'width':param.ViewPage.Page_Button.length>1?'39.5%':'48.5%'}">{{param.ViewPage.Page_Button[0].ShowName}}</button>
         <view class="uni-padding-wrap" v-if="param.ViewPage.Page_Button.length>1">
            <view class="uni-btn-v">
               <a @tap="actionSheetTap"><Icon class="mobox-normal-more"/></a>
            </view>
         </view>
      </view>
     <view class="view-floor" v-if="param.ViewPage.Page_Button">
        <!-- <button type="default" @click="cancel" class="btn_cancel"
        :style="{'width':param.ViewPage.Page_Button.length>1?'39.5%':'48.5%'}">返回</button> -->
        <button type="default" class="btn_refresh" v-for="(btn,index) in param.ViewPage.Page_Button"
           v-if="index<2" @click="onBtnClick(btn)"
           :style="{'width':param.ViewPage.Page_Button.length==1?'96%':param.ViewPage.Page_Button.length>2?'39.5%':'48%'}"
        >{{btn.ShowName}}</button>
        <view class="uni-padding-wrap" v-if="param.ViewPage.Page_Button.length>2">
           <view class="uni-btn-v">
              <a @tap="actionSheetTap"><Icon class="mobox-normal-more"/></a>
           </view>
        </view>
     </view>
    </view>
</template>
@@ -484,22 +488,45 @@
                 if(!ret.result.style_def.includes('"')) styledef = Base64.decode(ret.result.style_def);
            }
            $this.$data.detail2_styledef = ret.result.style_def? JSON.parse(styledef): {};
            $this.$data.detail2_styledef.SelBut_Checked = true;
            $this.$data.detail2_styledef.SelBut_Checked = false;
            // console.log($this.$data.detail2_styledef);
            $this.styleDef.form.attrs.forEach((attr) => {
              // info[attr.name]=attr.value;
              $this.detail2_styledef.form.items.forEach(ele=>{
              $this.detail2_styledef.form.items.forEach(async(ele,index)=>{
                if(ele.name!='Layout'){
                  if(ele.fieldId == attr.name) ele.value = attr.value;
                  if(ele.fieldId == attr.name){
                     ele.value = attr.value;
                    //任务表只有仓库库区货位编码,根据编码查询名称
                    if(ele.fieldId == 'S_START_WH' || ele.fieldId == 'S_END_WH')
                      await $this.dataObjQuery('Warehouse',"S_CODE='"+ele.value+"'",index,-1);
                    else if(ele.fieldId == 'S_START_AREA' || ele.fieldId == 'S_END_AREA')
                      await $this.dataObjQuery('Area',"S_CODE='"+ele.value+"'",index,-1);
                    else if(ele.fieldId == 'S_START_LOC' || ele.fieldId == 'S_END_LOC')
                      await $this.dataObjQuery('Location',"S_CODE='"+ele.value+"'",index,-1);
                  }
                } else if(ele.name=='Layout'){
                  ele.setting.colList.forEach(col=>{
                  ele.setting.colList.forEach(async(col,key)=>{
                    if(col){
                      if(col.fieldId == attr.name) col.value = attr.value;
                      if(col.fieldId == attr.name){
                        col.value = attr.value;
                        //任务表只有仓库库区货位编码,根据编码查询名称
                        if(col.fieldId == 'S_START_WH' || col.fieldId == 'S_END_WH')
                          await $this.dataObjQuery('Warehouse',"S_CODE='"+col.value+"'",index,key);
                        else if(col.fieldId == 'S_START_AREA' || col.fieldId == 'S_END_AREA')
                          await $this.dataObjQuery('Area',"S_CODE='"+col.value+"'",index,key);
                        else if(col.fieldId == 'S_START_LOC' || col.fieldId == 'S_END_LOC')
                          await $this.dataObjQuery('Location',"S_CODE='"+col.value+"'",index,key);
                      }
                    }
                  });
                }
              });
            });
            setTimeout(function(){
               var detail2_styledef = JSON.parse(JSON.stringify($this.detail2_styledef));
               $this.detail2_styledef=[];
               $this.detail2_styledef = detail2_styledef;
            },100);
         }else{
            uni.showModal({title:"错误1",content:ret.err_msg,showCancel:false,confirmText:"取消"});
         }
@@ -509,6 +536,136 @@
      });
       
   },
   //查询数据类数据信息
   async dataObjQuery(clsid,where,index,key){
     try{
       var $this = this;
      var dataInfo={
         class_id: clsid,
         attrs: [],
         condition: this.toWhereBase64String(""+ where +""),
         prj_rel_type: "",
         order_by: this.orderby,
         page_size: 99999,
         page: 1,
         query_id: '',
      };
      this.$store.dispatch('dataObjQuery',dataInfo).then(ret=>{
         // console.log(ret);
         if (ret.err_code == 0) {
            if(ret.result){
              $this.detail1StyleDefList=[];
              ret.result.obj_list.forEach((obj) => {
                var info ={
                    S_ID:obj.id,
                };
                obj.attr_list.forEach((attr) => {
                  info[attr.name]=attr.value;
                });
               if(key != -1)
                 $this.detail2_styledef.form.items[index].setting.colList[key].value2=info.S_NAME;
               else
                 $this.detail2_styledef.form.items[index].value2=info.S_NAME;
              });
              // console.log($this.detail2_styledef);
            }
         }else{
            uni.showModal({title:"错误5",content:ret.err_msg,showCancel:false,confirmText:"取消"});
         }
      }).catch(ex=>{
         // console.log(ex);
         uni.showModal({title:"错误5.1",content:ex.errMsg,showCancel:false,confirmText:"取消"});
      });
     } catch (ex) {
       var tip = typeof ex == "string" ? ex : ex.message;
      uni.showModal({title:"错误5.2",content:tip,showCancel:false,confirmText:"取消"});
     }
   },
   // 内容变化后事件
   async onChange(event) {
       try {
           if (event.id) {
             var obj_attr = this.detail2_styledef.form.model;
             // console.log(obj_attr);
             var input_param = Base64.encode(
               JSON.stringify(
                 Object.keys(obj_attr).map((a) => ({
                   attr: a,
                   value: obj_attr[a] || "",
                 }))
               )
             );
           var $this = this;
           var dataInfo={
               ed_type: 0,
            start_transaction: true,
               class_id: this.$data.detail2_styledef.form.clsId,
            class_name: '',
               event_id: event.id,
            event_name: '',
            data_obj_id: '',
               obj_attr: obj_attr,
            prj_id: '',
            ref_cls_id: '',
            rel_obj_id: '',
            user_login: '',
            data_json: '',
            compose_info: '',
            ext_info: '',
            global_attr: '',
               input_param: input_param,
             };
           this.$store.dispatch('runCustomEvent',dataInfo).then(ret=>{
              // console.log(ret);
              if (ret.err_code == 0) {
               var result = ret.result;
               if (result.ret != 0) {
                   var tip = result.err_info ? typeof result.err_info == 'string' ? result.err_info : result.err_info.join('<br/>') : '';
                   if (result.ret == 801) uni.showModal({title:'提示',content:tip,showCancel:false,confirmText:"取消"});
                   else uni.showModal({title:'提示',content:tip+',提示:'+result.ret,showCancel:false,confirmText:"取消"});
                  return false;
               }else{
                  var tip = result.info ? typeof result.info == 'string' ? result.info : result.info.join('<br/>') : '';
                  if (tip) uni.showModal({title:'提示',content:tip,showCancel:false,confirmText:"取消"});
                  if(result.result_type == 0 && result.action){
                     result.action.forEach(item=>{
                        if(item.action_type == "set_dlg_attr"){
                          // value = {"attr":"xxx", "value":"xxx"}
                          var data = item.value;
                          $this.$data.detail2_styledef.form.items.forEach(async (ele,index) => {
                            data.forEach(async (ele2,index) => {
                              if(ele.fieldId == ele2.attr){
                                ele.value = ele2.value;
                              }
                            });
                          });
                        }
                     });
                  }else{
                     // this.detail2StyleDefList=[];
                     if(result.info){
                        uni.showModal({title:"提示",content:result.info,showCancel:false,confirmText:"取消"});
                     }
                  }
               }
              }else{
                 uni.showModal({title:"错误8",content:ret.err_msg,showCancel:false,confirmText:"取消"});
              }
           }).catch(ex=>{
              // console.log(ex);
              uni.showModal({title:"错误8.1",content:ex.errMsg,showCancel:false,confirmText:"取消"});
           });
           }
       } catch (ex) {
           var tip = typeof ex == "string" ? ex : ex.message;
         uni.showModal({title:"错误8.2",content:"执行“内容变化后”事件失败:" + tip,showCancel:false,confirmText:"取消"});
       }
   },
   //点击按钮
   onBtnClick(btn){
     var that = this
@@ -530,8 +687,9 @@
   actionSheetTap() {
        var that = this
      var itemlist=[];
      this.param.ViewPage.Page_Button.forEach((btn) => {
         itemlist.push(btn.ShowName);
      this.param.ViewPage.Page_Button.forEach((btn,index) => {
         if(index>=2)
            itemlist.push(btn.ShowName);
      });
        uni.showActionSheet({
           // title: '按钮列表',
@@ -655,6 +813,147 @@
       }
   },
   
   /**
    * 只支持["column1='A' or column2='B'", "column3='C' and column4='D'", "column5='E'"]这种格式
    * {
    *     "model": 0 / 1,
    *     "condition":
    *     [
    *         [
    *             { },
    *             { },
    *             { }
    *         ],
    *         [
    *             { }
    *         ],
    *         [
    *             { }
    *         ]
    *     ]
    * }
    */
   toWhereBase64String(list) {
       if (typeof list == 'string') list = [list]
       var sql = []
       var seps = [' not in', ' in', '<>', '!=', '<=', '>=', '<', '=', '>', ' like']
       list.forEach(ls => {
           var where = ls.trim().toLowerCase()
           if (where.startsWith('(') && where.endsWith(')')) where = where.replace(/^\(/, '').replace(/\)$/, '')
           if (where.includes(' and ')) {
               // 二级and放在第一级数组中
               where.split(' and ').forEach(li => {
                   var l = li.trim()
                   if (l.startsWith('(') && l.endsWith(')')) l = l.replace(/^\(/, '').replace(/\)$/, '')
                   var sep = ''
                   for (var i = 0; i < seps.length; i++) {
                       if (l.includes(seps[i])) {
                           sep = seps[i]
                           break
                       }
                   }
                   if (sep) {
                       var values = l.split(sep)
                       var field = values[0]?.trim().replace(/^\[/, '').replace(/\]$/, '')
                       var value = ''
                       var op = sep.trim()
                       if ([' in', ' not in'].includes(sep) && values[1].includes('select ') && values[1].includes(' from ')) {
                           value = l.replace(field, '').replace(/^\s*(in|not in)\s*/, '').trim()
                           if (value.startsWith('(') && value.endsWith(')')) value = value.replace(/^\(/, '').replace(/\)$/, '').trim()
                       }
                       else {
                           value = values[1]?.trim().replace(/^\'/, '').replace(/\'$/, '')
                           if (['in', 'not in'].includes(op)) {
                               value = value.replace(/^\(/, '').replace(/\)$/, '')
                               value = value.split(',').map(v => v.trim().replace(/^\'/, '').replace(/\'$/, ''))
                           }
                       }
                       sql.push([{ field, value, op }])
                   }
               })
           }
           else if (where.includes(' or ')) {
               // 二级or放在第二级同一组数组中
               var s = []
               where.split(' or ').forEach(li => {
                   var l = li.trim()
                   if (l.startsWith('(') && l.endsWith(')')) l = l.replace(/^\(/, '').replace(/\)$/, '')
                   var sep = ''
                   for (var i = 0; i < seps.length; i++) {
                       if (l.includes(seps[i])) {
                           sep = seps[i]
                           break
                       }
                   }
                   if (sep) {
                       var values = l.split(sep)
                       var field = values[0]?.trim().replace(/^\[/, '').replace(/\]$/, '')
                       var value = ''
                       var op = sep.trim()
                       if ([' in', ' not in'].includes(sep) && values[1].includes('select ') && values[1].includes(' from ')) {
                           value = l.replace(field, '').replace(/^\s*(in|not in)\s*/, '').trim()
                           if (value.startsWith('(') && value.endsWith(')')) value = value.replace(/^\(/, '').replace(/\)$/, '').trim()
                       }
                       else {
                           value = values[1]?.trim().replace(/^\'/, '').replace(/\'$/, '')
                           if (['in', 'not in'].includes(op)) {
                               value = value.replace(/^\(/, '').replace(/\)$/, '')
                               value = value.split(',').map(v => v.trim().replace(/^\'/, '').replace(/\'$/, ''))
                           }
                       }
                       sql.push([{ field, value, op }])
                   }
               })
               sql.push(s)
           }
           else {
               var li = where
               // 单一查询条件直接放在第一级数组中
               var l = li.trim()
               if (l.startsWith('(') && l.endsWith(')')) l = l.replace(/^\(/, '').replace(/\)$/, '')
               var sep = ''
               for (var i = 0; i < seps.length; i++) {
                   if (l.includes(seps[i])) {
                       sep = seps[i]
                       break
                   }
               }
               if (sep) {
                   var values = l.split(sep)
                   var field = values[0]?.trim().replace(/^\[/, '').replace(/\]$/, '')
                   var value = ''
                   var op = sep.trim()
                   if ([' in', ' not in'].includes(sep) && values[1].includes('select ') && values[1].includes(' from ')) {
                       value = l.replace(field, '').replace(/^\s*(in|not in)\s*/, '').trim()
                       if (value.startsWith('(') && value.endsWith(')')) value = value.replace(/^\(/, '').replace(/\)$/, '').trim()
                   }
                   else {
                       value = values[1]?.trim().replace(/^\'/, '').replace(/\'$/, '')
                       if (['in', 'not in'].includes(op)) {
                           value = value.replace(/^\(/, '').replace(/\)$/, '')
                           value = value.split(',').map(v => v.trim().replace(/^\'/, '').replace(/\'$/, ''))
                       }
                   }
                   sql.push([{ field, value, op }])
               }
           }
       })
       if (sql.length > 0)
           return Base64.encode(JSON.stringify({
               model: 1,
               condition: sql
           }))
       else
       return ''
   },
   cancel(e){ //取消
      var eventChannel = this.$scope.eventChannel;
      // const eventChannel = this.getOpenerEventChannel();