grid新建主从一对多

news2025/1/15 21:58:25

目录

  • 总结
  • 一、步骤
    • 前端
      • 1.第一步-编写tabs的modelBody
      • 2.第二步编辑表扩展js
    • 后端--重写表的add和Update方法
      • 1.第一步


总结

编写tabs的modelBody后编辑表扩展js在重写后端partial的Service

一、步骤

前端

1.第一步-编写tabs的modelBody

  • 复制下面代码该改的改
<template>
  <div class="vol-tabs" style="height: 390px">
    <el-tabs
      type="border-card"
      style="
        min-height: 370px;
        box-shadow: none;
        border-bottom: 0;
        border-top: 1px solid #eee;
      "
    >
      <el-tab-pane>
        <template #label>
          <span><i class="el-icon-date"></i> 研发产品BOM清单</span>
        </template>
        <!-- 显示操作按钮 -->
        <div>
          <el-button type="primary" icon="Close" link @click="del('table1')"
            >删除行</el-button
          >
          <el-button type="success" icon="Plus" link @click="add('table1')"
            >添加行</el-button
          >
          <el-button
            type="info"
            icon="Refresh"
            link
            @click="$refs.table1.load()"
            >刷新</el-button
          >
        </div>
        <!-- :defaultLoadPage="false"打开窗口禁用默认加载数据 -->
        <vol-table
          ref="table1"
          :clickEdit="true"
          :loadKey="true"
          :columns="tableColumns1"
          :pagination-hide="false"
          :height="275"
          :url="table1Url"
          :index="true"
          :defaultLoadPage="false"
          @loadBefore="loadTableBefore"
          @loadAfter="loadTableAfter"
          :beginEdit="beginEdit"
        ></vol-table>
      </el-tab-pane>

      <!-- 从表2 -->
      <el-tab-pane :lazy="false" label="检测报告">
        <template #label>
          <span><i class="el-icon-date"></i> 检测报告</span>
        </template>
        <!-- 从表2配置 ,双击可以开启编辑-->
        <div style="padding-bottom: 10px">
          <el-button type="primary" icon="Close" link @click="del('table2')"
            >删除行</el-button
          >
          <el-button type="success" icon="Plus" link @click="add('table2')"
            >添加行</el-button
          >
          <el-button
            type="info"
            icon="Refresh"
            link
            @click="$refs.table2.load()"
            >刷新</el-button
          >
        </div>
        <vol-table
          ref="table2"
          :loadKey="true"
          :clickEdit="true"
          :columns="tableColumns2"
          :pagination-hide="false"
          :height="275"
          :url="table2Url"
          :defaultLoadPage="false"
          @loadBefore="loadTableBefore"
          @loadAfter="loadTableAfter"
          :index="true"
          :beginEdit="beginEdit"
        ></vol-table>
      </el-tab-pane>
    </el-tabs>
  </div>
</template>
<script>
//开发一对多从表需要参照voltable与viewgrid组件api
import VolTable from "@/components/basic/VolTable.vue";
export default {
  components: { VolTable },
  data() {
    return {
      //从表1
      table1Url: "api/CY_RD_COMPONENT_DETAIL_LIST/GetPageData", //table1获取数据的接口
      //表配置的字段注意要与后台返回的查询字段大小写一致
      tableColumns1: [
        {
          field: "PRODUCT_DETAIL_LIST_ID",
          title: "ID",
          type: "long",
          width: 110,
          hidden: true,
          align: "left",
        },
        {
          field: "COMMENT_PROJECT_NO",
          title: "元器件清单编号",
          type: "string",
          link: true,
          width: 150,
          require: true,
          align: "left",
          sort: true,
          edit: { type: "text" },
        },
        {
          field: "PRODUCT_CODE",
          title: "产品编码",
          type: "string",
          width: 110,
          require: true,
          align: "left",
        },
        {
          field: "PRODUCT_DETAIL_CODE",
          title: "产品详细信息编号",
          type: "string",
          width: 200,
          require: true,
          align: "left",
          edit: { type: "text" },
          hidden: true,
        },
        {
          field: "COMPONENT_CODE",
          title: "元器件编号",
          type: "string",
          width: 110,
          require: true,
          align: "left",
          edit: { type: "text" },
        },
        {
          field: "COMPONENT_POSITION",
          title: "元器件位号",
          type: "string",
          width: 220,
          require: true,
          align: "left",
          edit: { type: "text" },
        },
        {
          field: "BaseQtyN",
          title: "单位用量",
          type: "decimal",
          width: 110,
          align: "left",
          edit: { type: "decimal" },
        },
      ],
      //从表2
      table2Url: "api/CY_RD_PRODUCT_TEST_REPORT/GetPageData", //table2获取数据的接口
      //表配置的字段注意要与后台返回的查询字段大小写一致
      tableColumns2: [
        {
          field: "PRODUCT_REPORT_ID",
          title: "ID",
          type: "long",
          width: 110,
          hidden: true,
          align: "left",
        },
        {
          field: "PRODUCT_CODE",
          title: "产品编码",
          type: "string",
          link: true,
          width: 110,
          require: true,
          align: "left",
          sort: true,
        },
        {
          field: "TEST_REPORT_CODE",
          title: "检测报告编号",
          type: "string",
          width: 110,
          require: true,
          align: "left",
          edit: { type: "text" },
        },
        {
          field: "TEST_TYPE",
          title: "检测类型",
          type: "string",
          bind: { key: "检测类型(形式评价,入网检测)", data: [] },
          width: 110,
          require: true,
          align: "left",
          edit: { type: "select" },
        },
        {
          field: "TEST_ORGANIZATION",
          title: "检测机构",
          type: "string",
          bind: { key: "检测机构", data: [] },
          width: 110,
          require: true,
          align: "left",
          edit: { type: "select" },
        },
        {
          field: "REPORT_FROM_ORGANIZATION",
          title: "报告出具单位",
          type: "string",
          width: 110,
          require: true,
          align: "left",
          edit: { type: "text" },
        },
        {
          field: "REPORT_DATE",
          title: "报告出具日期",
          type: "string",
          width: 110,
          require: true,
          align: "left",
          edit: { type: "date" },
        },
        {
          field: "REPORT_VALID_DATE",
          title: "报告有效期",
          type: "string",
          width: 110,
          require: true,
          align: "left",
          edit: { type: "date" },
        },
        {
          field: "WITNESS_MATERIAL_URL",
          title: "见证材料附件地址",
          type: "string",
          width: 220,
          require: true,
          align: "left",
          edit: { type: "file" },
        },
      ],
    };
  },
  methods: {
    add(table) {
      let $parent = null;
      //当前是子页面,获取查询viewgrid页面的对象()
      this.$emit("parentCall", ($this) => {
        $parent = $this;
      });
      if (table === "table1") {
        if ($parent.editFormFields.PRODUCT_CODE != "") {
          this.$refs.table1.rowData.unshift({
            COMMENT_PROJECT_NO: "",
            PRODUCT_CODE: $parent.editFormFields.PRODUCT_CODE,
            PRODUCT_DETAIL_CODE: $parent.editFormFields.PRODUCT_DETAIL_CODE,
            MODULE_TYPE: "",
            DEVELOPMENT_PROJECT_NO:
              $parent.editFormFields.DEVELOPMENT_PROJECT_NO,
            HARDWARE_VERSION: "",
            COMPONENT_CODE: "",
            COMPONENT_POSITION: "",
            // WRITE_DATE: "",
            // HANDLE_FLAG: "",
            // HANDLE_DATE: "",
            // NOTICE_NO: "",
            // ENTERPRISE_CODE: "",
            BaseQtyN: "",
            PRODUCT_DETAIL_ID: 0,
          });
        } else {
          this.$Message.info("请先选择研发方案");
        }
      } else if (table === "table2") {
        if ($parent.editFormFields.PRODUCT_CODE != "") {
          this.$refs.table2.rowData.unshift({
            PRODUCT_CODE: $parent.editFormFields.PRODUCT_CODE,
            PRODUCT_DETAIL_CODE: $parent.editFormFields.PRODUCT_DETAIL_CODE,
            DEVELOPMENT_PROJECT_NO:
              $parent.editFormFields.DEVELOPMENT_PROJECT_NO,
            TEST_REPORT_CODE: "",
            TEST_TYPE: "",
            TEST_ORGANIZATION: "",
            REPORT_FROM_ORGANIZATION: "",
            REPORT_DATE: "",
            REPORT_VALID_DATE: "",
            WITNESS_MATERIAL_URL: "",
            // WRITE_DATE: "",
            // HANDLE_FLAG: "",
            // HANDLE_DATE: "",
            // NOTICE_NO: "",
            // ENTERPRISE_CODE: "",
            PRODUCT_DETAIL_ID: 0,
          });
        } else {
          this.$Message.info("请先选择研发方案");
        }
      }
    },
    //如果要获取页面的参数请使用 this.$emit("parentCall",见下面的使用方法
    modelOpen() {
      let $parent;
      //获取生成页面viewgrid的对象
      this.$emit("parentCall", ($this) => {
        $parent = $this;
      });
      //当前如果是新建重置两个表格数据
      if ($parent.currentAction == "Add") {
        this.$refs.table1.reset();
        this.$refs.table2.reset();
      } else {
        //如果是编辑,添加两个表格的数据
        this.$refs.table1.load();
        this.$refs.table2.load();
      }
    },
    loadTableBefore(param, callBack) {
      let $parent = null;
      //当前是子页面,获取查询viewgrid页面的对象()
      this.$emit("parentCall", ($this) => {
        $parent = $this;
      });
      //如果是新建功能,禁止刷新操作
      if ($parent.currentAction == "Add") {
        return callBack(false);
      }
      //获取当前编辑主键id值
      let id = $parent.currentRow.PRODUCT_DETAIL_ID;
      //添加从表的查询参数(条件)
      //将当前选中的行主键传到后台用于查询(后台在GetTable2Data(PageDataOptions loadData)会接收到此参数)
      param.wheres.push({ name: "PRODUCT_DETAIL_ID", value: id });
      callBack(true);
    },
    //从后台加载从表1数据后
    loadTableAfter(data, callBack) {
      return true;
    },
    del(table) {
      if (table == "table1") {
        let rows = this.$refs.table1.getSelected();
        if (rows.length == 0) {
          return this.$Message.error("请先选中行");
        }
        //请求后台删除从表1的数据
        let url = "api/CY_RD_COMPONENT_DETAIL_LIST/del";
        this.http.post(url, [rows[0].PRODUCT_DETAIL_LIST_ID], false).then((reslut) => {
          if (reslut.status === true) {
            //删除行
            this.$refs.table1.delRow();
            this.$Message.success("删除成功");
          } else {
            this.$Message.error(reslut.message);
          }
        });
      } else if (table == "table2") {
        //删除行后删除从表2的数据
        let rows = this.$refs.table2.getSelected();
        if (rows.length == 0) {
          return this.$Message.error("请先选中行");
        }
        //请求后台删除从表2的数据
        let url = "api/CY_RD_PRODUCT_TEST_REPORT/del";
        this.http.post(url, [rows[0].PRODUCT_REPORT_ID], false).then((reslut) => {
          if (reslut.status === true) {
            //删除行
            this.$refs.table2.delRow();
            this.$Message.success("删除成功");
          } else {
            this.$Message.error(reslut.message);
          }
        });
      }

      //可以this.http.post调用后台实际执行查询
    },
    clear(table) {
      table == "table1" ? this.$refs.table1.reset() : this.$refs.table2.reset();
    },
    getRows(table) {
      if (table == "table1") {
        //获取选中的行
        let rows = this.$refs.table1.getSelected();
        if (rows.length == 0) {
          return this.$Message.error("请先选中行");
        }
        this.$Message.error(JSON.stringify(rows));
      } else if (table == "table2") {
        //获取选中的行
        let rows = this.$refs.table2.getSelected();
        if (rows.length == 0) {
          return this.$Message.error("请先选中行");
        }
        this.$Message.error(JSON.stringify(rows));
      }
    },
  },
};
</script>
<style lang="less" scoped>
.vol-tabs {
  background: white;
}
</style>

2.第二步编辑表扩展js

  • 导入modelBody
import App_ExpertModelBody from '@/extension/business/cy_dev_business/extend/RD_PROJECT_ModelBody'
  • 注册组件
components: {
    //查询界面扩展组件
    gridHeader: gridHeader,
    gridBody: '',
    gridFooter: '',
    //新建、编辑弹出框扩展组件
    modelHeader: '',
    modelBody: App_ExpertModelBody,
    modelFooter: '',
  },
  • 修改表扩展js—从表增改逻辑—请求后台
addBefore(formData) { //弹出框新建或编辑功能点保存时可以将从表1,从表2的数据提到后台
      this.setFormData(formData);
      return true;
    },
    addAfter(result) {//编辑保存后result返回的状态及表单对象
      // this.$Notice.success({ title: this.detailOptions.cnName + '编辑完成后:', desc: '返回的数据' + JSON.stringify(result) });
      result.status == true ?
        this.$Message.success('保存成功') :
        this.$Message.error('失败!' + result.message)
      return true;
    },
    updateBefore(formData) { //编辑时功能点保存时可以将从表1,从表2的数据提到后台
      this.setFormData(formData);
      return true;
    },
    updateAfter(result) {//编辑保存后result返回的状态及表单对象
      // this.$Notice.success({ title: this.detailOptions.cnName + '编辑完成后:', desc: '返回的数据' + JSON.stringify(result) });
      result.status == true ?
        this.$Message.success('保存成功') :
        this.$Message.error('失败!' + result.message)
      return true;
    },
    setFormData(formData) { //新建或编辑时,将从表1、2的数据提交到后台,见后台App_ReportPriceService的新建方法
      //后台从对象里直接取extra的值
      let extra = {
        table1List: this.$refs.modelBody.$refs.table1.rowData,//获取从表1的行数据
        table2List: this.$refs.modelBody.$refs.table2.rowData//获取从表2的行数据
      }
      formData.extra = JSON.stringify(extra);
    },

结果类似如下图:
在这里插入图片描述

后端–重写表的add和Update方法

1.第一步

  • 重写表的add和Update方法
/*
 *所有关于CY_RD_PRODUCT_DETAIL类的业务代码应在此处编写
 *可使用repository.调用常用方法,获取EF/Dapper等信息
 *如果需要事务请使用repository.DbContextBeginTransaction
 *也可使用DBServerProvider.手动获取数据库相关信息
 *用户信息、权限、角色等使用UserContext.Current操作
 *CY_RD_PRODUCT_DETAILService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
 */

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using VOL.Core.BaseProvider;
using VOL.Core.Extensions.AutofacManager;
using VOL.Entity.DomainModels;
using System.Linq;
using VOL.Core.Utilities;
using System.Linq.Expressions;
using VOL.Core.Extensions;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;
using SqlSugar;
using VOL.Business.IRepositories;
using VOL.Business.Repositories;
using VOL.Entity.SystemModels;

namespace VOL.Business.Services
{
    public partial class CY_RD_PRODUCT_DETAILService
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly ICY_RD_PRODUCT_DETAILRepository _repository;//访问数据库

        [ActivatorUtilitiesConstructor]
        public CY_RD_PRODUCT_DETAILService(
            ICY_RD_PRODUCT_DETAILRepository dbRepository,
            IHttpContextAccessor httpContextAccessor
            )
        : base(dbRepository)
        {
            _httpContextAccessor = httpContextAccessor;
            _repository = dbRepository;
            //多租户会用到这init代码,其他情况可以不用
            //base.Init(dbRepository);
        }

        WebResponseContent _webResponse = new WebResponseContent();

        public override WebResponseContent Add(SaveModel saveDataModel)
        {
            //取出校验完成后的从表1.2的数据
            TableExtra tableExtra = saveDataModel.Extra.ToString().DeserializeObject<TableExtra>();
            //保存到数据库前
            AddOnExecuting = (CY_RD_PRODUCT_DETAIL detail, object obj) =>
            {
                //根据自定义注册规则生成序列号 2024-2-4 13:57:02 可以写一个通用方法调用
                if (string.IsNullOrWhiteSpace(detail.PRODUCT_DETAIL_CODE))
                {
                    //detail.PRODUCT_DETAIL_CODE = GetCustCodeFromRule("ProductDetailRule");
                }

                //如果返回false,后面代码不会再执行
                if (repository.Exists(x => x.PRODUCT_DETAIL_CODE == detail.PRODUCT_DETAIL_CODE))
                {
                    return _webResponse.Error("产品详细信息编号已存在");
                }
                return WebResponseContent.Instance.OK();
            };
            //Equip_SpotMaintPlan 此处已经提交了数据库,处于事务中
            AddOnExecuted = (CY_RD_PRODUCT_DETAIL detail, object obj) =>
            {
                int i = 0;
                //在此操作tableExtra从表信息
                List<CY_RD_COMPONENT_DETAIL_LIST> newsList = tableExtra.Table1List.Select(s => new CY_RD_COMPONENT_DETAIL_LIST
                {
                    COMMENT_PROJECT_NO = s.COMMENT_PROJECT_NO,
                    PRODUCT_CODE = detail.PRODUCT_CODE,
                    PRODUCT_DETAIL_CODE = detail.PRODUCT_DETAIL_CODE,
                    MODULE_TYPE = s.MODULE_TYPE,
                    DEVELOPMENT_PROJECT_NO = detail.DEVELOPMENT_PROJECT_NO,
                    HARDWARE_VERSION = s.HARDWARE_VERSION,
                    COMPONENT_CODE = s.COMPONENT_CODE,
                    COMPONENT_POSITION = s.COMPONENT_POSITION,
                    WRITE_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    HANDLE_FLAG = "N",
                    BaseQtyN = s.BaseQtyN,
                    PRODUCT_ID = s.PRODUCT_ID,
                    PRODUCT_DETAIL_ID = detail.PRODUCT_DETAIL_ID
                }).ToList();

                //id=0的默认为新增的数据
                List<CY_RD_COMPONENT_DETAIL_LIST> addList = newsList.ToList();
                //设置默认创建人信息
                addList.ForEach(x => { x.SetCreateDefaultVal(); });
                //新增
                repository.AddRange(addList);
                int j = 0;
                //点检保养项目
                List<CY_RD_PRODUCT_TEST_REPORT> newsList2 = tableExtra.Table2List.Select(s => new CY_RD_PRODUCT_TEST_REPORT
                {
                    PRODUCT_CODE = detail.PRODUCT_CODE,
                    PRODUCT_DETAIL_CODE = detail.PRODUCT_DETAIL_CODE,
                    DEVELOPMENT_PROJECT_NO = detail.DEVELOPMENT_PROJECT_NO,
                    TEST_REPORT_CODE = s.TEST_REPORT_CODE,
                    TEST_TYPE = s.TEST_TYPE,
                    TEST_ORGANIZATION = s.TEST_ORGANIZATION,
                    REPORT_FROM_ORGANIZATION = s.REPORT_FROM_ORGANIZATION,
                    REPORT_DATE = s.REPORT_DATE,
                    REPORT_VALID_DATE = s.REPORT_VALID_DATE,
                    WITNESS_MATERIAL_URL = s.WITNESS_MATERIAL_URL,
                    WRITE_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    HANDLE_FLAG = "N",
                    PRODUCT_ID = s.PRODUCT_ID,
                    PRODUCT_DETAIL_ID = detail.PRODUCT_DETAIL_ID
                }).ToList();

                //id=0的默认为新增的数据
                List<CY_RD_PRODUCT_TEST_REPORT> addList2 = newsList2.ToList();
                //设置默认创建人信息
                addList2.ForEach(x => { x.SetCreateDefaultVal(); });
                //新增
                repository.AddRange(addList2);
                //最终保存
                repository.SaveChanges(); 
                return WebResponseContent.Instance.OK();
            };
            return base.Add(saveDataModel);
        }

        /// <summary>
        /// 自定义更新从表操作
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        public override WebResponseContent Update(SaveModel saveModel)
        {
            //取出校验完成后的从表1.2的数据
            TableExtra tableExtra = saveModel.Extra.ToString().DeserializeObject<TableExtra>();

            //保存到数据库前
            UpdateOnExecuting = (CY_RD_PRODUCT_DETAIL plan, object obj, object obj2, List<object> list) =>
            {
                return WebResponseContent.Instance.OK();
            };

            //App_ReportPrice 此处已经提交了数据库,处于事务中
            UpdateOnExecuted = (CY_RD_PRODUCT_DETAIL detail, object obj, object obj2, List<object> list) =>
            {
                List<CY_RD_COMPONENT_DETAIL_LIST> newsList = tableExtra.Table1List.Select(s => new CY_RD_COMPONENT_DETAIL_LIST
                {
                    COMMENT_PROJECT_NO = s.COMMENT_PROJECT_NO,
                    PRODUCT_CODE = detail.PRODUCT_CODE,
                    PRODUCT_DETAIL_CODE = detail.PRODUCT_DETAIL_CODE,
                    MODULE_TYPE = s.MODULE_TYPE,
                    DEVELOPMENT_PROJECT_NO = detail.DEVELOPMENT_PROJECT_NO,
                    HARDWARE_VERSION = s.HARDWARE_VERSION,
                    COMPONENT_CODE = s.COMPONENT_CODE,
                    COMPONENT_POSITION = s.COMPONENT_POSITION,
                    WRITE_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    HANDLE_FLAG = "N",
                    BaseQtyN = s.BaseQtyN,
                    PRODUCT_ID = s.PRODUCT_ID,
                    PRODUCT_DETAIL_ID = detail.PRODUCT_DETAIL_ID,
                    PRODUCT_DETAIL_LIST_ID=s.PRODUCT_DETAIL_LIST_ID
                }).ToList();

                //id=0的默认为新增的数据
                List<CY_RD_COMPONENT_DETAIL_LIST> addList = newsList.Where(d=>d.PRODUCT_DETAIL_LIST_ID == 0).ToList();
                //设置默认创建人信息
                addList.ForEach(x => { x.SetCreateDefaultVal(); });
                //新增
                repository.AddRange(addList);

                //获取所有编辑行
                List<long> editIds = newsList.Where(x => x.PRODUCT_DETAIL_LIST_ID != 0).Select(s => s.PRODUCT_DETAIL_LIST_ID).ToList();
                //从数据库查询编辑的行是否存在,如果数据库不存在,执行修改操作会异常
                List<long> existsIds = CY_RD_COMPONENT_DETAIL_LISTRepository.Instance.FindAsIQueryable(x => editIds.Contains(x.PRODUCT_DETAIL_LIST_ID)).Select(s => s.PRODUCT_DETAIL_LIST_ID).ToList();
                //获取实际可以修改的数据
                List<CY_RD_COMPONENT_DETAIL_LIST> updateList = newsList.Where(x => existsIds.Contains(x.PRODUCT_DETAIL_LIST_ID)).ToList();
                //设置默认修改人信息
                updateList.ForEach(x => { x.SetModifyDefaultVal(); });
                //修改(第二个参数指定要修改的字段,第三个参数执行保存)
                repository.UpdateRange(updateList, x => new { x.HARDWARE_VERSION, x.COMPONENT_CODE, x.COMPONENT_POSITION, x.BaseQtyN });


                //删除不需要的记录
                 
                //点检保养项目
                List<CY_RD_PRODUCT_TEST_REPORT> newsList2 = tableExtra.Table2List.Select(s => new CY_RD_PRODUCT_TEST_REPORT
                {
                    PRODUCT_CODE = detail.PRODUCT_CODE,
                    PRODUCT_DETAIL_CODE = detail.PRODUCT_DETAIL_CODE,
                    DEVELOPMENT_PROJECT_NO = detail.DEVELOPMENT_PROJECT_NO,
                    TEST_REPORT_CODE = s.TEST_REPORT_CODE,
                    TEST_TYPE = s.TEST_TYPE,
                    TEST_ORGANIZATION = s.TEST_ORGANIZATION,
                    REPORT_FROM_ORGANIZATION = s.REPORT_FROM_ORGANIZATION,
                    REPORT_DATE = s.REPORT_DATE,
                    REPORT_VALID_DATE = s.REPORT_VALID_DATE,
                    WITNESS_MATERIAL_URL = s.WITNESS_MATERIAL_URL,
                    WRITE_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    HANDLE_FLAG = "N",
                    PRODUCT_ID = s.PRODUCT_ID,
                    PRODUCT_DETAIL_ID = detail.PRODUCT_DETAIL_ID,
                    PRODUCT_REPORT_ID=s.PRODUCT_REPORT_ID
                }).ToList();

                //id=0的默认为新增的数据
                List<CY_RD_PRODUCT_TEST_REPORT> addList2 = newsList2.Where(x=>x.PRODUCT_REPORT_ID==0).ToList();
                //设置默认创建人信息
                addList2.ForEach(x => { x.SetCreateDefaultVal(); });
                //新增
                repository.AddRange(addList2);


                //获取所有编辑行
                List<long> editIds2 = newsList2.Where(x => x.PRODUCT_REPORT_ID != 0).Select(s => s.PRODUCT_REPORT_ID).ToList();
                //从数据库查询编辑的行是否存在,如果数据库不存在,执行修改操作会异常
                List<long> existsIds2 = CY_RD_PRODUCT_TEST_REPORTRepository.Instance.FindAsIQueryable(x => editIds2.Contains(x.PRODUCT_REPORT_ID)).Select(s => s.PRODUCT_REPORT_ID).ToList();
                //获取实际可以修改的数据
                List<CY_RD_PRODUCT_TEST_REPORT> updateList2 = newsList2.Where(x => existsIds2.Contains(x.PRODUCT_REPORT_ID)).ToList();
                //设置默认修改人信息
                updateList2.ForEach(x => { x.SetModifyDefaultVal(); });
                //修改(第二个参数指定要修改的字段,第三个参数执行保存)
                repository.UpdateRange(updateList2, x => new { x.TEST_TYPE, x.TEST_ORGANIZATION, x.REPORT_FROM_ORGANIZATION, x.REPORT_DATE, x.WITNESS_MATERIAL_URL, x.REPORT_VALID_DATE });
                
                //最终保存
                repository.SaveChanges();

                return WebResponseContent.Instance.OK();
            };

            return base.Update(saveModel);
        }

        public class TableExtra
        {
            /// <summary>
            /// 从表1
            /// </summary>
            public List<CY_RD_COMPONENT_DETAIL_LIST> Table1List { get; set; }

            /// <summary>
            /// 从表2
            /// </summary>
            public List<CY_RD_PRODUCT_TEST_REPORT> Table2List { get; set; }
        } 
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1459012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang for 循环

从基础知识到高级技术、并发和通道 Go&#xff08;Golang&#xff09;编程语言中的“for”循环是一个基本而多功能的结构&#xff0c;用于迭代集合、重复执行代码块以及管理循环控制流。Golang的“for”循环语法简洁却强大&#xff0c;为处理多样的循环场景提供了一系列能力。无…

【2024软件测试面试必会技能】adb命令操作

前言&#xff1a; adb的全称为(Android Debug Bridge&#xff09;就是调试桥的作用。Adb 命令存放在 SDK 的Tools文件夹下&#xff0c;又称为手机和电脑连接的桥梁命令。 借助这个工具&#xff0c;我们可以管理设备或手机模拟器的状态。还可以进行以下的操作&#xff1a; 快…

计算机功能简介:EC, NVMe, SCSI/ISCSI与块存储接口 RBD,NUMA

一 EC是指Embedded Controller 主要应用于移动计算机系统和嵌入式计算机系统中&#xff0c;为此类计算机提供系统管理功能。EC的主要功能是控制计算机主板上电时序、管理电池充电和放电&#xff0c;提供键盘矩阵接口、智能风扇接口、串口、GPIO、PS/2等常规IO功能&#xff0c;…

C#分部类的应用:记录学生信息

目录 一、分部类及其用途 二、实例 再发一个分部类的应用&#xff0c;巩固一下。 一、分部类及其用途 C#中的部分类也被称为分部类。 C#中的部分类是一种将类的定义分成多个部分&#xff0c;每个部分都位于自己的文件中&#xff0c;然后在编译时合并在一起的机制。 部分类…

SNAT与DNAT公私网地址转换

前言 SNAT和DNAT是两种重要的网络地址转换技术&#xff0c;它们允许内部网络中的多个主机共享单个公共IP地址&#xff0c;或者将公共IP地址映射到内部网络中的特定主机。这些技术在构建企业级网络和互联网应用程序时非常重要&#xff0c;因为它们可以帮助保护内部网络安全&…

75.SpringMVC的拦截器和过滤器有什么区别?执行顺序?

75.SpringMVC的拦截器和过滤器有什么区别&#xff1f;执行顺序&#xff1f; 区别 拦截器不依赖与servlet容器&#xff0c;过滤器依赖与servlet容器。拦截器只能对action请求(DispatcherServlet 映射的请求)起作用&#xff0c;而过滤器则可以对几乎所有的请求起作用。拦截器可…

阿里云服务器操作系统有哪些?如何选择?

阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文版&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…

深入理解java虚拟机---自动内存管理

2.2 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些区域则是依赖用户线程的启动和结束而建立和销…

[word] word定时自动保存功能的作用是什么 #知识分享#学习方法#媒体

word定时自动保存功能的作用是什么 word定时自动保存功能的作用是什么 这是word提供的一个保护用户文档的功能&#xff0c;一般情况下是为了预防在未知原因的情况下&#xff0c;用户电脑关闭&#xff0c;或者不小关掉Word&#xff0c;导致正在使用的文档丢失&#xff0c;给用户…

华清远见作业第三十九天——Qt(第一天)

思维导图&#xff1a; 登录界面&#xff1a; 代码&#xff1a; #include "mainwindow.h" #include<QToolBar> #include<QPushButton> MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(600,400);this->setFixedSize…

Vue+SpringBoot打造生活废品回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

C++拷贝构造函数与赋值运算符重载

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、拷贝构造函数 1.概念 在现实生活中&#xff0c;可能存在一个与你一样的自己&#xff0c;我们称其为双胞胎。 那在创…

day1:组件的代码实现

思维导图 设计一个登录界面 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowFlag(Qt::FramelessWindowHint);this->resize(700,550);this->setWindowIcon(QIcon("D:/学校工作/截图/b1.jpg"));/***…

经验分享——Jmeter压力测试工具安装,使用

之前测试都是简单的写个线程模拟请求测试&#xff0c;后面经同事推荐这款压力测试工具。真的很好用&#xff0c;使用过几次了&#xff0c;于是把自己使用过程中遇到的问题&#xff0c;以及相关配置分享出来。希望给需要用到的人一些帮助。 一 下载 首选下载这款工具&#xff…

【蜂窝物联】公寓WiFi全覆盖解决方案

项目背景 随着移动设备越来越普及&#xff0c;人们对于网络的需求愈发强烈&#xff0c;WIFI覆盖也逐渐进入网民的视野中。部署无线网络不仅能提高出租屋服务水平及竞争力&#xff0c;同时也可以为出租屋提高收入&#xff0c;蜂窝为出租屋房东提供一套完整的解决方案。 01 需求…

SICTF Round#3 wp web

web hacker sql无列名注入&#xff1b; 提示查询username参数&#xff0c;flag在flag表中&#xff1b; 传参测试发现&#xff0c;union select 可用&#xff0c;空格被过滤可以使用/**/代替 &#xff0c;or也被过滤了且无法大小写、双写等绕过&#xff0c;导致无法查询flag表…

【开源】SpringBoot框架开发高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

java8的 lambda表达式到stream API总结备忘

文章目录 1. Lambda 表达式为什么使用 Lambda 表达式从匿名类到 Lambda 的转换Lambda 表达式语法语法格式一&#xff1a;无参&#xff0c;无返回值&#xff0c;Lambda 体只需一条语句语法格式二&#xff1a;Lambda 需要一个参数语法格式三&#xff1a;Lambda 只需要一个参数时&…

如何在iStoreOS软路由系统中安装cpolar实现公网远程本地电脑桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…

微信商户平台:如何查看超级管理员

如果有普通员工身份&#xff0c;可以登录 https://pay.weixin.qq.com/index.php/core/account/info 扫码进入后&#xff0c;进入菜单&#xff1a;账户中心》商户信息&#xff0c; 即可看到超级管理员的信息。