gagamel 5 лет назад
Родитель
Сommit
2c85926d8f
100 измененных файлов с 19280 добавлено и 19383 удалено
  1. 17 17
      .project
  2. 2 2
      .settings/org.eclipse.core.resources.prefs
  3. 4 4
      .settings/org.eclipse.m2e.core.prefs
  4. 159 159
      pom.xml
  5. 0 45
      style24.admin/.classpath
  6. 2 2
      style24.admin/.gitignore
  7. 42 42
      style24.admin/.project
  8. 0 13
      style24.admin/.settings/.jsdtscope
  9. 0 6
      style24.admin/.settings/org.eclipse.core.resources.prefs
  10. 0 12
      style24.admin/.settings/org.eclipse.jdt.core.prefs
  11. 0 4
      style24.admin/.settings/org.eclipse.m2e.core.prefs
  12. 0 10
      style24.admin/.settings/org.eclipse.wst.common.component
  13. 0 7
      style24.admin/.settings/org.eclipse.wst.common.project.facet.core.xml
  14. 0 1
      style24.admin/.settings/org.eclipse.wst.jsdt.ui.superType.container
  15. 0 1
      style24.admin/.settings/org.eclipse.wst.jsdt.ui.superType.name
  16. 0 2
      style24.admin/.settings/org.eclipse.wst.validation.prefs
  17. 0 2
      style24.admin/.settings/org.springframework.ide.eclipse.prefs
  18. 106 106
      style24.admin/pom.xml
  19. 34 34
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaAnswerPhaseDao.java
  20. 234 234
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaBusinessDao.java
  21. 51 51
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaClauseDao.java
  22. 52 52
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaCommonDao.java
  23. 34 34
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaEnvsetDao.java
  24. 43 43
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaFaqDao.java
  25. 551 551
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java
  26. 68 68
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaLoginDao.java
  27. 92 92
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaNoticeDao.java
  28. 62 62
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOcmDao.java
  29. 226 226
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java
  30. 237 237
      style24.admin/src/main/java/com/style24/admin/biz/dao/TsaSystemDao.java
  31. 53 53
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaAnswerPhaseService.java
  32. 326 326
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaBusinessService.java
  33. 68 68
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaClauseService.java
  34. 71 71
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaCommonService.java
  35. 74 74
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaEnvsetService.java
  36. 66 66
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaFaqService.java
  37. 1608 1608
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java
  38. 234 234
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaKakaoService.java
  39. 111 111
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaLoginService.java
  40. 153 153
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaNoticeService.java
  41. 94 94
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaOcmService.java
  42. 523 523
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaRendererService.java
  43. 417 417
      style24.admin/src/main/java/com/style24/admin/biz/service/TsaSystemService.java
  44. 242 242
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaBoardController.java
  45. 571 571
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaBusinessController.java
  46. 221 221
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaCommonController.java
  47. 276 276
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaEnvsetController.java
  48. 1417 1417
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java
  49. 178 178
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaOcmController.java
  50. 203 203
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaRendererController.java
  51. 169 169
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaSettleController.java
  52. 422 422
      style24.admin/src/main/java/com/style24/admin/biz/web/TsaSystemController.java
  53. 23 23
      style24.admin/src/main/java/com/style24/persistence/domain/Aflink.java
  54. 42 42
      style24.admin/src/main/java/com/style24/persistence/domain/Brand.java
  55. 25 25
      style24.admin/src/main/java/com/style24/persistence/domain/BrandMd.java
  56. 25 25
      style24.admin/src/main/java/com/style24/persistence/domain/Color.java
  57. 28 28
      style24.admin/src/main/java/com/style24/persistence/domain/Extmall.java
  58. 27 27
      style24.admin/src/main/java/com/style24/persistence/domain/ExtmallNoti.java
  59. 23 23
      style24.admin/src/main/java/com/style24/persistence/domain/ExtmallPriceSync.java
  60. 29 29
      style24.admin/src/main/java/com/style24/persistence/domain/Faq.java
  61. 167 167
      style24.admin/src/main/java/com/style24/persistence/domain/Goods.java
  62. 93 93
      style24.admin/src/main/java/com/style24/persistence/domain/GoodsCategory.java
  63. 20 20
      style24.admin/src/main/java/com/style24/persistence/domain/GoodsDesc.java
  64. 68 68
      style24.admin/src/main/java/com/style24/persistence/domain/GoodsHst.java
  65. 42 42
      style24.admin/src/main/java/com/style24/persistence/domain/GoodsImg.java
  66. 33 33
      style24.admin/src/main/java/com/style24/persistence/domain/NotiInfo.java
  67. 23 23
      style24.admin/src/main/java/com/style24/persistence/domain/SampleFile.java
  68. 24 24
      style24.admin/src/main/java/com/style24/persistence/domain/SearchData.java
  69. 22 22
      style24.admin/src/main/java/com/style24/persistence/domain/SellStore.java
  70. 22 22
      style24.admin/src/main/java/com/style24/persistence/domain/ShipCompany.java
  71. 23 23
      style24.admin/src/main/java/com/style24/persistence/domain/SiteBrand.java
  72. 31 31
      style24.admin/src/main/java/com/style24/persistence/domain/StockSyncBase.java
  73. 71 71
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaAnswerPhase.xml
  74. 810 810
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml
  75. 90 90
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaClause.xml
  76. 64 64
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaCommon.xml
  77. 63 63
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaEnvset.xml
  78. 89 89
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaFaq.xml
  79. 2080 2080
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  80. 212 212
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaLogin.xml
  81. 174 174
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaNotice.xml
  82. 141 141
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOcm.xml
  83. 364 364
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml
  84. 622 622
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaSystem.xml
  85. 66 66
      style24.admin/src/main/resources/config/application-locd.yml
  86. 82 82
      style24.admin/src/main/resources/config/application-locp.yml
  87. 64 64
      style24.admin/src/main/resources/config/application.yml
  88. 79 79
      style24.admin/src/main/resources/i18n/messages/message_ko_KR.properties
  89. 187 187
      style24.admin/src/main/webapp/WEB-INF/views/board/FaqDetailForm.html
  90. 523 523
      style24.admin/src/main/webapp/WEB-INF/views/board/NoticeForm.html
  91. 270 270
      style24.admin/src/main/webapp/WEB-INF/views/business/AflinkForm.html
  92. 616 616
      style24.admin/src/main/webapp/WEB-INF/views/business/BrandForm.html
  93. 382 382
      style24.admin/src/main/webapp/WEB-INF/views/business/DeliveryLocForm.html
  94. 205 205
      style24.admin/src/main/webapp/WEB-INF/views/business/SellStoreForm.html
  95. 172 172
      style24.admin/src/main/webapp/WEB-INF/views/business/ShipCompanyForm.html
  96. 492 492
      style24.admin/src/main/webapp/WEB-INF/views/business/SupplyCompanyForm.html
  97. 254 254
      style24.admin/src/main/webapp/WEB-INF/views/envset/AnswerPhaseForm.html
  98. 379 379
      style24.admin/src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html
  99. 192 192
      style24.admin/src/main/webapp/WEB-INF/views/envset/ClauseDetailForm.html
  100. 234 234
      style24.admin/src/main/webapp/WEB-INF/views/envset/EnvsetHistoryForm.html

+ 17 - 17
.project

@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>STYLE24</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>STYLE24</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>

+ 2 - 2
.settings/org.eclipse.core.resources.prefs

@@ -1,2 +1,2 @@
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
+eclipse.preferences.version=1
+encoding/<project>=UTF-8

+ 4 - 4
.settings/org.eclipse.m2e.core.prefs

@@ -1,4 +1,4 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 159 - 159
pom.xml

@@ -1,160 +1,160 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.3.3.RELEASE</version>
-		<relativePath/> <!-- lookup parent from repository -->
-	</parent>
-	<groupId>com.style24</groupId>
-	<artifactId>root</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<packaging>pom</packaging>
-	<name>com.style24.root</name>
-	<description>STYLE24 ROOT</description>
-	<modules>
-		<module>style24.core</module>
-		<module>style24.admin</module>
-		<module>style24.scm</module>
-	</modules>
-	
-	<properties>
-		<java.version>1.8</java.version>
-		<skipTests>true</skipTests>
-	</properties>
-	
-	<dependencyManagement>
-		<dependencies>
-			<dependency>
-				<groupId>com.style24.core</groupId>
-				<artifactId>style24.core</artifactId>
-				<version>1.0.0</version>
-				<type>jar</type>
-				<scope>compile</scope>
-			</dependency>
-		</dependencies>
-	</dependencyManagement>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-cache</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-jdbc</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-validation</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-			<exclusions>
-				<exclusion>
-					<groupId>org.springframework.boot</groupId>
-					<artifactId>spring-boot-starter-tomcat</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web-services</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.data</groupId>
-			<artifactId>spring-data-commons</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.mybatis.spring.boot</groupId>
-			<artifactId>mybatis-spring-boot-starter</artifactId>
-			<version>2.1.3</version>
-		</dependency>
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-			<optional>true</optional>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-tomcat</artifactId>
-			<scope>provided</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-			<exclusions>
-				<exclusion>
-					<groupId>org.junit.vintage</groupId>
-					<artifactId>junit-vintage-engine</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-lang3</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpclient</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.googlecode.json-simple</groupId>
-			<artifactId>json-simple</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		
-		<!-- /// Redis -->
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-data-redis</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.session</groupId>
-			<artifactId>spring-session-data-redis</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-pool2</artifactId>
-		</dependency>
-		<!-- \\\ Redis -->
-		
-		<!-- /// Excel POI -->
-		<dependency>
-			<groupId>org.apache.poi</groupId>
-			<artifactId>poi</artifactId>
-			<version>3.17</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.poi</groupId>
-			<artifactId>poi-ooxml</artifactId>
-			<version>3.17</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.poi</groupId>
-			<artifactId>poi-ooxml-schemas</artifactId>
-			<version>3.17</version>
-		</dependency>
-		<!-- \\\ Excel POI -->
-		
-	</dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-plugin</artifactId>
-				<configuration>
-					<skipTests>${skipTests}</skipTests>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.3.3.RELEASE</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+	<groupId>com.style24</groupId>
+	<artifactId>root</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>pom</packaging>
+	<name>com.style24.root</name>
+	<description>STYLE24 ROOT</description>
+	<modules>
+		<module>style24.core</module>
+		<module>style24.admin</module>
+		<module>style24.scm</module>
+	</modules>
+	
+	<properties>
+		<java.version>1.8</java.version>
+		<skipTests>true</skipTests>
+	</properties>
+	
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>com.style24.core</groupId>
+				<artifactId>style24.core</artifactId>
+				<version>1.0.0</version>
+				<type>jar</type>
+				<scope>compile</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-cache</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-jdbc</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-validation</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+			<exclusions>
+				<exclusion>
+					<groupId>org.springframework.boot</groupId>
+					<artifactId>spring-boot-starter-tomcat</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web-services</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.data</groupId>
+			<artifactId>spring-data-commons</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mybatis.spring.boot</groupId>
+			<artifactId>mybatis-spring-boot-starter</artifactId>
+			<version>2.1.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<optional>true</optional>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-tomcat</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.junit.vintage</groupId>
+					<artifactId>junit-vintage-engine</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.googlecode.json-simple</groupId>
+			<artifactId>json-simple</artifactId>
+			<version>1.1.1</version>
+		</dependency>
+		
+		<!-- /// Redis -->
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-redis</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.session</groupId>
+			<artifactId>spring-session-data-redis</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-pool2</artifactId>
+		</dependency>
+		<!-- \\\ Redis -->
+		
+		<!-- /// Excel POI -->
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi</artifactId>
+			<version>3.17</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.17</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml-schemas</artifactId>
+			<version>3.17</version>
+		</dependency>
+		<!-- \\\ Excel POI -->
+		
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<skipTests>${skipTests}</skipTests>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
 </project>

+ 0 - 45
style24.admin/.classpath

@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry including="**/*.java" kind="src" output="target/classes" path="src/main/java">
-		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
-		<attributes>
-			<attribute name="test" value="true"/>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
-		<attributes>
-			<attribute name="test" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
-		<attributes>
-			<attribute name="maven.pomderived" value="true"/>
-			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v9.0.22"/>
-	<classpathentry kind="lib" path="/style24.core/target/classes">
-		<attributes>
-			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/classes"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>

+ 2 - 2
style24.admin/.gitignore

@@ -1,3 +1,3 @@
-target/
-.settings/
+target/
+.settings/
 .classpath

+ 42 - 42
style24.admin/.project

@@ -1,42 +1,42 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>style24.admin</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.common.project.facet.core.builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.validation.validationbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.springframework.ide.eclipse.boot.validation.springbootbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.m2e.core.maven2Nature</nature>
-		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
-		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>style24.admin</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.springframework.ide.eclipse.boot.validation.springbootbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+	</natures>
+</projectDescription>

+ 0 - 13
style24.admin/.settings/.jsdtscope

@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src/main/webapp"/>
-	<classpathentry excluding="**/bower_components/*|**/node_modules/*|**/*.min.js" kind="src" path="target/m2e-wtp/web-resources"/>
-	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
-		<attributes>
-			<attribute name="hide" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
-	<classpathentry kind="output" path=""/>
-</classpath>

+ 0 - 6
style24.admin/.settings/org.eclipse.core.resources.prefs

@@ -1,6 +0,0 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding//src/main/resources=UTF-8
-encoding//src/test/java=UTF-8
-encoding//src/test/resources=UTF-8
-encoding/<project>=UTF-8

+ 0 - 12
style24.admin/.settings/org.eclipse.jdt.core.prefs

@@ -1,12 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8

+ 0 - 4
style24.admin/.settings/org.eclipse.m2e.core.prefs

@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1

+ 0 - 10
style24.admin/.settings/org.eclipse.wst.common.component

@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
-    <wb-module deploy-name="style24.admin">
-        <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
-        <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
-        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
-        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
-        <property name="context-root" value="style24.admin"/>
-        <property name="java-output-path" value="/style24.admin/target/classes"/>
-    </wb-module>
-</project-modules>

+ 0 - 7
style24.admin/.settings/org.eclipse.wst.common.project.facet.core.xml

@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<faceted-project>
-  <fixed facet="wst.jsdt.web"/>
-  <installed facet="java" version="1.8"/>
-  <installed facet="jst.web" version="4.0"/>
-  <installed facet="wst.jsdt.web" version="1.0"/>
-</faceted-project>

+ 0 - 1
style24.admin/.settings/org.eclipse.wst.jsdt.ui.superType.container

@@ -1 +0,0 @@
-org.eclipse.wst.jsdt.launching.baseBrowserLibrary

+ 0 - 1
style24.admin/.settings/org.eclipse.wst.jsdt.ui.superType.name

@@ -1 +0,0 @@
-Window

+ 0 - 2
style24.admin/.settings/org.eclipse.wst.validation.prefs

@@ -1,2 +0,0 @@
-disabled=06target
-eclipse.preferences.version=1

+ 0 - 2
style24.admin/.settings/org.springframework.ide.eclipse.prefs

@@ -1,2 +0,0 @@
-boot.validation.initialized=true
-eclipse.preferences.version=1

+ 106 - 106
style24.admin/pom.xml

@@ -1,107 +1,107 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.style24</groupId>
-		<artifactId>root</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-	</parent>
-	<groupId>com.style24.admin</groupId>
-	<artifactId>style24.admin</artifactId>
-	<packaging>war</packaging>
-	<name>style24.admin</name>
-	<description>STYLE24 Admin</description>
-	
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-security</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.security</groupId>
-			<artifactId>spring-security-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-		
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-thymeleaf</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>nz.net.ultraq.thymeleaf</groupId>
-			<artifactId>thymeleaf-layout-dialect</artifactId>
-		</dependency>
-		
-		<!-- /// WEB-INF lib -->
-		<dependency>
-			<groupId>com.gagaframework</groupId>
-			<artifactId>gagaframework-web-core</artifactId>
-			<version>1.7-RELEASE</version>
-			<scope>system</scope>
-			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-core-1.7-RELEASE.jar</systemPath>
-		</dependency>
-		<dependency>
-			<groupId>com.gagaframework</groupId>
-			<artifactId>gagaframework-web-parameter</artifactId>
-			<version>1.7-RELEASE</version>
-			<scope>system</scope>
-			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-parameter-1.7-RELEASE.jar</systemPath>
-		</dependency>
-		<dependency>
-			<groupId>com.gagaframework</groupId>
-			<artifactId>gagaframework-web-rest</artifactId>
-			<version>1.7.1-RELEASE</version>
-			<scope>system</scope>
-			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-rest-1.7-RELEASE.jar</systemPath>
-		</dependency>
-		<dependency>
-			<groupId>com.gagaframework</groupId>
-			<artifactId>gagaframework-web-util</artifactId>
-			<version>1.7-RELEASE</version>
-			<scope>system</scope>
-			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-util-1.7-RELEASE.jar</systemPath>
-		</dependency>
-		<dependency>
-			<groupId>com.gagaframework</groupId>
-			<artifactId>gagaframework-excel</artifactId>
-			<version>1.7.1-RELEASE</version>
-			<scope>system</scope>
-			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-excel-1.7.1-RELEASE.jar</systemPath>
-		</dependency>
-		<!-- \\\ WEB-INF lib -->
-		<dependency>
-			<groupId>servlets.com</groupId>
-			<artifactId>cos</artifactId>
-			<version>05Nov2002</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-fileupload</groupId>
-			<artifactId>commons-fileupload</artifactId>
-			<version>1.4</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-			<version>2.6</version>
-		</dependency>
-		
-	</dependencies>
-	
-	<build>
-		<finalName>${project.name}</finalName>
-		<resources>
-			<resource>
-				<directory>src/main/java</directory>
-				<includes>
-					<include>**/*.xml</include>
-				</includes>
-			</resource>
-			<resource>
-				<directory>src/main/resources</directory>
-				<includes>
-					<include>**/*</include>
-				</includes>
-			</resource>
-		</resources>
-	</build>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.style24</groupId>
+		<artifactId>root</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<groupId>com.style24.admin</groupId>
+	<artifactId>style24.admin</artifactId>
+	<packaging>war</packaging>
+	<name>style24.admin</name>
+	<description>STYLE24 Admin</description>
+	
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-security</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.security</groupId>
+			<artifactId>spring-security-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-thymeleaf</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>nz.net.ultraq.thymeleaf</groupId>
+			<artifactId>thymeleaf-layout-dialect</artifactId>
+		</dependency>
+		
+		<!-- /// WEB-INF lib -->
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-web-core</artifactId>
+			<version>1.7-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-core-1.7-RELEASE.jar</systemPath>
+		</dependency>
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-web-parameter</artifactId>
+			<version>1.7-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-parameter-1.7-RELEASE.jar</systemPath>
+		</dependency>
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-web-rest</artifactId>
+			<version>1.7.1-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-rest-1.7-RELEASE.jar</systemPath>
+		</dependency>
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-web-util</artifactId>
+			<version>1.7-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-util-1.7-RELEASE.jar</systemPath>
+		</dependency>
+		<dependency>
+			<groupId>com.gagaframework</groupId>
+			<artifactId>gagaframework-excel</artifactId>
+			<version>1.7.1-RELEASE</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-excel-1.7.1-RELEASE.jar</systemPath>
+		</dependency>
+		<!-- \\\ WEB-INF lib -->
+		<dependency>
+			<groupId>servlets.com</groupId>
+			<artifactId>cos</artifactId>
+			<version>05Nov2002</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-fileupload</groupId>
+			<artifactId>commons-fileupload</artifactId>
+			<version>1.4</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.6</version>
+		</dependency>
+		
+	</dependencies>
+	
+	<build>
+		<finalName>${project.name}</finalName>
+		<resources>
+			<resource>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**/*.xml</include>
+				</includes>
+			</resource>
+			<resource>
+				<directory>src/main/resources</directory>
+				<includes>
+					<include>**/*</include>
+				</includes>
+			</resource>
+		</resources>
+	</build>
 </project>

+ 34 - 34
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaAnswerPhaseDao.java

@@ -1,34 +1,34 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.AnswerPhase;
-
-/**
- * 답변문구 Dao
- * 
- * @author gagamel
- * @since 2020. 10. 29
- */
-@ShopDs
-public interface TsaAnswerPhaseDao {
-
-	/**
-	 * 답변문구 목록
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	Collection<AnswerPhase> getAnswerPhaseList(AnswerPhase ansPhase);
-
-	/**
-	 * 답변문구 등록/수정
-	 * @param ansPhase - 답변문구 정보
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	void saveAnswerPhase(AnswerPhase ansPhase);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.AnswerPhase;
+
+/**
+ * 답변문구 Dao
+ * 
+ * @author gagamel
+ * @since 2020. 10. 29
+ */
+@ShopDs
+public interface TsaAnswerPhaseDao {
+
+	/**
+	 * 답변문구 목록
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	Collection<AnswerPhase> getAnswerPhaseList(AnswerPhase ansPhase);
+
+	/**
+	 * 답변문구 등록/수정
+	 * @param ansPhase - 답변문구 정보
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	void saveAnswerPhase(AnswerPhase ansPhase);
+
+}

+ 234 - 234
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaBusinessDao.java

@@ -1,234 +1,234 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Aflink;
-import com.style24.persistence.domain.Brand;
-import com.style24.persistence.domain.BrandMd;
-import com.style24.persistence.domain.DeliveryLoc;
-import com.style24.persistence.domain.SellStore;
-import com.style24.persistence.domain.ShipCompany;
-import com.style24.persistence.domain.SiteBrand;
-import com.style24.persistence.domain.StockSyncBase;
-import com.style24.persistence.domain.SupplyCompany;
-
-/**
- * 영업관리 Dao
- *
- * @author gagamel
- * @since 2020. 10. 14
- */
-@ShopDs
-public interface TsaBusinessDao {
-
-	/**
-	 * 공급업체 목록
-	 * @param supplyComp - 공급업체 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 14
-	 */
-	Collection<SupplyCompany> getSupplyCompanyList(SupplyCompany supplyComp);
-
-	/**
-	 * 공급업체 생성
-	 * @param supplyComp - 공급업체 정보
-	 * @author gagamel
-	 * @since 2020. 10. 14
-	 */
-	void createSupplyCompany(SupplyCompany supplyComp);
-
-	/**
-	 * 공급업체 수정
-	 * @param supplyComp - 공급업체 정보
-	 * @author gagamel
-	 * @since 2020. 10. 14
-	 */
-	void updateSupplyCompany(SupplyCompany supplyComp);
-
-	/**
-	 * 출고처관리 목록
-	 * @param delvLoc - 출고처 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 16
-	 */
-	Collection<DeliveryLoc> getDeliveryLocList(DeliveryLoc delvLoc);
-
-	/**
-	 * 브랜드 목록
-	 * @param brand - 브랜드 정보
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	Collection<Brand> getBrandList(Brand brand);
-
-	/**
-	 * 담당MD 목록
-	 * @param brandMd - 담당MD 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	Collection<BrandMd> getMdList(BrandMd brandMd);
-
-	/**
-	 * 브랜드담당MD 목록
-	 * @param brandCd - 브랜드코드
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	Collection<BrandMd> getBrandMdList(String brandCd);
-
-	/**
-	 * 브랜드담당MD 삭제
-	 * @param brandCd - 브랜드코드
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	void deleteBrandMd(String brandCd);
-
-	/**
-	 * 브랜드담당MD 등록
-	 * @param brandMd - 브랜드담당MD 정보
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	void createBrandMd(BrandMd brandMd);
-
-	/**
-	 * 브랜드 노출사이트 목록
-	 * @param brandCd - 브랜드코드
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	Collection<SiteBrand> getBrandSiteList(String brandCd);
-
-	/**
-	 * 브랜드 노출사이트 등록/수정
-	 * @param siteBrand - 사이트브랜드 정보
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	void saveBrandSite(SiteBrand siteBrand);
-
-	/**
-	 * 브랜드 등록
-	 * @param brand - 브랜드 정보
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	void createBrand(Brand brand);
-
-	/**
-	 * 브랜드 수정
-	 * @param brand - 브랜드 정보
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	void updateBrand(Brand brand);
-
-	/**
-	 * 출고처관리 저장
-	 * @param delvLoc - 출고처 정보
-	 * @author gagamel
-	 * @since 2020. 10. 16
-	 */
-	void saveDeliveryLoc(DeliveryLoc delvLoc);
-
-	/**
-	 * 재고연계관리 - 출고처 목록
-	 * @param delvLoc - 출고처 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	Collection<DeliveryLoc> getStockSyncDeliveryLocList(DeliveryLoc delvLoc);
-
-	/**
-	 * 재고연계관리 - 재고연계기준 목록
-	 * @param stockSyncBase - 재고연계기준 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	Collection<StockSyncBase> getStockSyncBaseList(StockSyncBase stockSyncBase);
-
-	/**
-	 * 재고연계관리 - 재고연계기준 저장
-	 * @param stockSyncBase - 재고연계기준 정보
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	void saveStockSyncBase(StockSyncBase stockSyncBase);
-
-	/**
-	 * 판매매장 목록
-	 * @param sellStore - 판매매장 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	Collection<SellStore> getSellStoreList(SellStore sellStore);
-
-	/**
-	 * 판매매장 정보 수정
-	 * @param sellStore - 판매매장 정보
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	void saveSellStore(SellStore sellStore);
-
-	/**
-	 * 제휴링크 목록
-	 * @param aflink - 제휴링크 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	Collection<Aflink> getAflinkList(Aflink aflink);
-
-	/**
-	 * 제휴링크 저장
-	 * @param aflink - 제휴링크 정보
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	void saveAflink(Aflink aflink);
-
-	/**
-	 * 제휴링크 삭제
-	 * @param aflink - 제휴링크 정보
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	void deleteAflink(Aflink aflink);
-
-	/**
-	 * 배송업체 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	Collection<ShipCompany> getShipCompanyList();
-
-	/**
-	 * 배송업체 저장
-	 * @param shipComp - 배송업체 정보
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	void saveShipCompany(ShipCompany shipComp);
-
-	/**
-	 * 배송업체 삭제
-	 * @param shipComp - 배송업체 정보
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	void deleteShipCompany(ShipCompany shipComp);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Aflink;
+import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.BrandMd;
+import com.style24.persistence.domain.DeliveryLoc;
+import com.style24.persistence.domain.SellStore;
+import com.style24.persistence.domain.ShipCompany;
+import com.style24.persistence.domain.SiteBrand;
+import com.style24.persistence.domain.StockSyncBase;
+import com.style24.persistence.domain.SupplyCompany;
+
+/**
+ * 영업관리 Dao
+ *
+ * @author gagamel
+ * @since 2020. 10. 14
+ */
+@ShopDs
+public interface TsaBusinessDao {
+
+	/**
+	 * 공급업체 목록
+	 * @param supplyComp - 공급업체 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 14
+	 */
+	Collection<SupplyCompany> getSupplyCompanyList(SupplyCompany supplyComp);
+
+	/**
+	 * 공급업체 생성
+	 * @param supplyComp - 공급업체 정보
+	 * @author gagamel
+	 * @since 2020. 10. 14
+	 */
+	void createSupplyCompany(SupplyCompany supplyComp);
+
+	/**
+	 * 공급업체 수정
+	 * @param supplyComp - 공급업체 정보
+	 * @author gagamel
+	 * @since 2020. 10. 14
+	 */
+	void updateSupplyCompany(SupplyCompany supplyComp);
+
+	/**
+	 * 출고처관리 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 16
+	 */
+	Collection<DeliveryLoc> getDeliveryLocList(DeliveryLoc delvLoc);
+
+	/**
+	 * 브랜드 목록
+	 * @param brand - 브랜드 정보
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	Collection<Brand> getBrandList(Brand brand);
+
+	/**
+	 * 담당MD 목록
+	 * @param brandMd - 담당MD 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	Collection<BrandMd> getMdList(BrandMd brandMd);
+
+	/**
+	 * 브랜드담당MD 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	Collection<BrandMd> getBrandMdList(String brandCd);
+
+	/**
+	 * 브랜드담당MD 삭제
+	 * @param brandCd - 브랜드코드
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	void deleteBrandMd(String brandCd);
+
+	/**
+	 * 브랜드담당MD 등록
+	 * @param brandMd - 브랜드담당MD 정보
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	void createBrandMd(BrandMd brandMd);
+
+	/**
+	 * 브랜드 노출사이트 목록
+	 * @param brandCd - 브랜드코드
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	Collection<SiteBrand> getBrandSiteList(String brandCd);
+
+	/**
+	 * 브랜드 노출사이트 등록/수정
+	 * @param siteBrand - 사이트브랜드 정보
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	void saveBrandSite(SiteBrand siteBrand);
+
+	/**
+	 * 브랜드 등록
+	 * @param brand - 브랜드 정보
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	void createBrand(Brand brand);
+
+	/**
+	 * 브랜드 수정
+	 * @param brand - 브랜드 정보
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	void updateBrand(Brand brand);
+
+	/**
+	 * 출고처관리 저장
+	 * @param delvLoc - 출고처 정보
+	 * @author gagamel
+	 * @since 2020. 10. 16
+	 */
+	void saveDeliveryLoc(DeliveryLoc delvLoc);
+
+	/**
+	 * 재고연계관리 - 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	Collection<DeliveryLoc> getStockSyncDeliveryLocList(DeliveryLoc delvLoc);
+
+	/**
+	 * 재고연계관리 - 재고연계기준 목록
+	 * @param stockSyncBase - 재고연계기준 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	Collection<StockSyncBase> getStockSyncBaseList(StockSyncBase stockSyncBase);
+
+	/**
+	 * 재고연계관리 - 재고연계기준 저장
+	 * @param stockSyncBase - 재고연계기준 정보
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	void saveStockSyncBase(StockSyncBase stockSyncBase);
+
+	/**
+	 * 판매매장 목록
+	 * @param sellStore - 판매매장 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	Collection<SellStore> getSellStoreList(SellStore sellStore);
+
+	/**
+	 * 판매매장 정보 수정
+	 * @param sellStore - 판매매장 정보
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	void saveSellStore(SellStore sellStore);
+
+	/**
+	 * 제휴링크 목록
+	 * @param aflink - 제휴링크 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	Collection<Aflink> getAflinkList(Aflink aflink);
+
+	/**
+	 * 제휴링크 저장
+	 * @param aflink - 제휴링크 정보
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	void saveAflink(Aflink aflink);
+
+	/**
+	 * 제휴링크 삭제
+	 * @param aflink - 제휴링크 정보
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	void deleteAflink(Aflink aflink);
+
+	/**
+	 * 배송업체 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	Collection<ShipCompany> getShipCompanyList();
+
+	/**
+	 * 배송업체 저장
+	 * @param shipComp - 배송업체 정보
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	void saveShipCompany(ShipCompany shipComp);
+
+	/**
+	 * 배송업체 삭제
+	 * @param shipComp - 배송업체 정보
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	void deleteShipCompany(ShipCompany shipComp);
+
+}

+ 51 - 51
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaClauseDao.java

@@ -1,51 +1,51 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Clause;
-
-/**
- * 약관 Dao
- * 
- * @author gagamel
- * @since 2020. 10. 29
- */
-@ShopDs
-public interface TsaClauseDao {
-
-	/**
-	 * 약관 목록
-	 * @param clause - 약관 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	Collection<Clause> getClauseList(Clause clause);
-
-	/**
-	 * 약관 상세
-	 * @param clause - 약관 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	Clause getClauseDetail(Integer clauseSq);
-
-	/**
-	 * 약관 생성
-	 * @param clause - 약관 정보
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	void createClause(Clause clause);
-
-	/**
-	 * 약관 수정
-	 * @param clause - 약관 정보
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	void updateClause(Clause clause);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Clause;
+
+/**
+ * 약관 Dao
+ * 
+ * @author gagamel
+ * @since 2020. 10. 29
+ */
+@ShopDs
+public interface TsaClauseDao {
+
+	/**
+	 * 약관 목록
+	 * @param clause - 약관 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	Collection<Clause> getClauseList(Clause clause);
+
+	/**
+	 * 약관 상세
+	 * @param clause - 약관 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	Clause getClauseDetail(Integer clauseSq);
+
+	/**
+	 * 약관 생성
+	 * @param clause - 약관 정보
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	void createClause(Clause clause);
+
+	/**
+	 * 약관 수정
+	 * @param clause - 약관 정보
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	void updateClause(Clause clause);
+
+}

+ 52 - 52
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaCommonDao.java

@@ -1,52 +1,52 @@
-package com.style24.admin.biz.dao;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.SearchData;
-
-/**
- * 공용 Dao
- *
- * @author eskim
- * @since 2020. 10. 22
- */
-@ShopDs
-public interface TsaCommonDao {
-
-	/**
-	 * 엑셀조회를 위한 SEARCH 테이블 삭제
-	 *
-	 * @param searchData
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	void deleteExceluploadSearCh(SearchData searchData);
-
-	/**
-	 * 엑셀조회를 위한 SEARCH 테이블 생성
-	 *
-	 * @param searchData
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	void createExceluploadSearch(SearchData searchData);
-
-	/**
-	 * 엑셀조회를 위한 SEARCH 테이블 생성 - dummy 컬럼 포함
-	 *
-	 * @param searchData
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	void createExceluploadSearchByAll(SearchData searchData);
-
-	/**
-	 * 샘플파일 시스템파일명 조회
-	 * @param sampleFileId - 샘플파일ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	String getSampleFileSystemFilename(String sampleFileId);
-
-
-}
+package com.style24.admin.biz.dao;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.SearchData;
+
+/**
+ * 공용 Dao
+ *
+ * @author eskim
+ * @since 2020. 10. 22
+ */
+@ShopDs
+public interface TsaCommonDao {
+
+	/**
+	 * 엑셀조회를 위한 SEARCH 테이블 삭제
+	 *
+	 * @param searchData
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	void deleteExceluploadSearCh(SearchData searchData);
+
+	/**
+	 * 엑셀조회를 위한 SEARCH 테이블 생성
+	 *
+	 * @param searchData
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	void createExceluploadSearch(SearchData searchData);
+
+	/**
+	 * 엑셀조회를 위한 SEARCH 테이블 생성 - dummy 컬럼 포함
+	 *
+	 * @param searchData
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	void createExceluploadSearchByAll(SearchData searchData);
+
+	/**
+	 * 샘플파일 시스템파일명 조회
+	 * @param sampleFileId - 샘플파일ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	String getSampleFileSystemFilename(String sampleFileId);
+
+
+}

+ 34 - 34
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaEnvsetDao.java

@@ -1,34 +1,34 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Envset;
-
-/**
- * 환경설정 Dao
- * 
- * @author gagamel
- * @since 2020. 10. 21
- */
-@ShopDs
-public interface TsaEnvsetDao {
-
-	/**
-	 * 환경설정 저장
-	 * @param envset - 환경설정 정보
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	void createEnvset(Envset envset);
-
-	/**
-	 * 환경설정 목록
-	 * @param envset - 환경설정 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	Collection<Envset> getEnvsetList(Envset envset);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Envset;
+
+/**
+ * 환경설정 Dao
+ * 
+ * @author gagamel
+ * @since 2020. 10. 21
+ */
+@ShopDs
+public interface TsaEnvsetDao {
+
+	/**
+	 * 환경설정 저장
+	 * @param envset - 환경설정 정보
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	void createEnvset(Envset envset);
+
+	/**
+	 * 환경설정 목록
+	 * @param envset - 환경설정 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	Collection<Envset> getEnvsetList(Envset envset);
+
+}

+ 43 - 43
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaFaqDao.java

@@ -1,43 +1,43 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Faq;
-
-/**
- * FAQ Dao
- * 
- * @author gagamel
- * @since 2020. 11. 3
- */
-@ShopDs
-public interface TsaFaqDao {
-
-	/**
-	 * FAQ 목록
-	 * @param faq - FAQ 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	Collection<Faq> getFaqList(Faq faq);
-
-	/**
-	 * FAQ 등록/수정
-	 * @param faq - FAQ 정보
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	void saveFaq(Faq faq);
-
-	/**
-	 * FAQ 상세
-	 * @param faqSq - FAQ일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	Faq getFaq(Integer faqSq);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Faq;
+
+/**
+ * FAQ Dao
+ * 
+ * @author gagamel
+ * @since 2020. 11. 3
+ */
+@ShopDs
+public interface TsaFaqDao {
+
+	/**
+	 * FAQ 목록
+	 * @param faq - FAQ 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	Collection<Faq> getFaqList(Faq faq);
+
+	/**
+	 * FAQ 등록/수정
+	 * @param faq - FAQ 정보
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	void saveFaq(Faq faq);
+
+	/**
+	 * FAQ 상세
+	 * @param faqSq - FAQ일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	Faq getFaq(Integer faqSq);
+
+}

+ 551 - 551
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaGoodsDao.java

@@ -1,551 +1,551 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Color;
-import com.style24.persistence.domain.Goods;
-import com.style24.persistence.domain.GoodsCompose;
-import com.style24.persistence.domain.GoodsDesc;
-import com.style24.persistence.domain.GoodsEpSkip;
-import com.style24.persistence.domain.GoodsHst;
-import com.style24.persistence.domain.GoodsNotiInfo;
-import com.style24.persistence.domain.GoodsSearch;
-import com.style24.persistence.domain.GoodsTnmRes;
-import com.style24.persistence.domain.Itemkind;
-import com.style24.persistence.domain.NotiInfo;
-import com.style24.persistence.domain.Notice;
-import com.style24.persistence.domain.NoticeGoods;
-import com.style24.persistence.domain.Option;
-
-import com.gagaframework.web.parameter.GagaMap;
-
-/**
- * 상품관리 Dao
- *
- * @author eskim
- * @since 2020. 10. 16
- */
-@ShopDs
-public interface TsaGoodsDao {
-
-	/**
-	 * 품목 목록
-	 * @param itemkind
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	Collection<Itemkind> getItemkindList(Itemkind itemkind);
-
-	/**
-	 * 품목 저장(등록/저장)
-	 * @param itemkind - 품목 정보
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	void saveItemkindInfo(Itemkind itemkind);
-
-	/**
-	 * 품목 삭제
-	 * @param itemkind - 품목 정보
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	void deleteItemkindInfo(Itemkind itemkind);
-
-	/**
-	 * 색상목록 조회
-	 *
-	 * @param color
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	Collection<Color> getColorList(Color color);
-
-	/**
-	 * 색상 저장
-	 * @param color
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	void saveColor(Color color);
-
-	/**
-	 * 상품정보고시 목록
-	 * @param notiInfo
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 19
-	 */
-	Collection<NotiInfo> getNotiInfoList(NotiInfo notiInfo);
-
-	/**
-	 * 상품정보고시 항목 목록
-	 * @param notiInfo
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 19
-	 */
-	Collection<NotiInfo> getNotiInfoItemList(NotiInfo notiInfo);
-
-	/**
-	 * 상품정보고시 상세 저장
-	 * @param notiInfo
-	 * @author eskim
-	 * @since 2010. 10. 19
-	 */
-	void saveNotiInfo(NotiInfo notiInfo);
-
-	/**
-	 * 상품 목록 건수
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 20
-	 */
-	int getGoodsListCount(GoodsSearch goodsSearch);
-
-	/**
-	 * 상품 목록
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 20
-	 */
-	Collection<Goods> getGoodsList(GoodsSearch goodsSearch);
-
-	/**
-	 * 상품 목록 기본정보 엑셀다운로드
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	Collection<GagaMap> getGoodsInfoExcelList(GoodsSearch goodsSearch);
-
-	/**
-	 * 상품 이미지 필수 항목 입력 여부 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	Collection<Goods> getGoodsImgsYn(Goods goods);
-
-	/**
-	 * 상품 상세
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	Goods getGoods(Goods goods);
-
-	/**
-	 * 상품 상세 정보 조회
-	 *
-	 * @param goodsVideo
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	Collection<GoodsDesc> getGoodsDescList(GoodsDesc goodsDesc);
-
-	/**
-	 * 상품 정보 이력
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2019. 08. 12
-	 */
-	Collection<GoodsHst> getGoodsHstList(Goods goods);
-
-	/**
-	 * 상품 옵션 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 26
-	 */
-	Collection<Option> getGoodsSizeList(Goods goods);
-
-
-	/**
-	 * 상품 고시 조회
-	 *
-	 * @param goodsNotiInfo
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 12
-	 */
-	Collection<GoodsNotiInfo> getGoodsNotiInfoList(GoodsNotiInfo goodsNotiInfo);
-
-	/**
-	 * 구성상품 목록
-	 *
-	 * @param goodsNotiInfo
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods);
-
-	/**
-	 * 같은 품번 상품목록
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	Collection<Goods> getGoodsNumGoodsList(Goods goods);
-
-	/**
-	 * 상품 기본 정보 이력 생성
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	void createGoodsHst(Goods goods);
-
-	/**
-	 * 상품 수정 항목 일괄변경
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	void updateGoodsState(Goods goods);
-
-	/**
-	 * 상품 품목변경
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	void updateGoodItemKindCd(Goods goods);
-
-	/**
-	 * 상품 자동 검색어 조회
-	 *
-	 * @param goodsCd
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	String getGoodsSnm(String goodsCd);
-
-	/**
-	 * 상품검색어 수정
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	void updateGoodsSnm(Goods goods);
-
-	/**
-	 * 상품 품목변경 고시정보 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	Collection<GoodsNotiInfo> getNewNotiInfo(Goods goods);
-
-	/**
-	 * 상품 품목변경 고시정보 삭제
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	void deleteGoodsNotiInfo(Goods goods);
-
-	/**
-	 * 상품 고시 정보 수정
-	 *
-	 * @param goodsNotiInfo
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	void saveGoodsNotiInfo(GoodsNotiInfo goodsNotiInfo);
-
-	/**
-	 * 상품 기본 정보 수정
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	void updateGoods(Goods goods);
-
-	/**
-	 * 상품 상세정보 삭제
-	 *
-	 * @param godsDesc
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	void deleteGoodsDesc(GoodsDesc godsDesc);
-
-	/**
-	 * 상품 상세정보 등록
-	 *
-	 * @param godsDesc
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	void createGoodsDesc(GoodsDesc godsDesc);
-
-	/**
-	 * 구성상품 저장
-	 *
-	 * @param goodsCompose
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	void saveGoodsCompose(GoodsCompose goodsCompose);
-
-	/**
-	 * 상품 옵션/재고 정보 이력생성
-	 *
-	 * @param option
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	void createStockHst(Option option);
-
-	/**
-	 * 상품 옵션/재고 정보 수정
-	 *
-	 * @param stock
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	void saveStock(Option option);
-
-	/**
-	 * 상품 기본 정보 등록
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	void createGoods(Goods goods);
-
-	/**
-	 * 상품통계 생성
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	void createGoodsSmmary(Goods goods);
-
-//	/**
-//	 * 상품 품목별 매핑 카테고리 저장
-//	 *
-//	 * @param goods
-//	 * @author eskim
-//	 * @since 2020. 10. 30
-//	 */
-//	void createCategoryGoods(Goods goods);
-
-//	/**
-//	 * 상품 이미지 저장
-//	 *
-//	 * @param goodsImg
-//	 * @author eskim
-//	 * @since 2020. 10. 30
-//	 */
-//	void saveGoodsImgInfo(GoodsImg goodsImg);
-
-	/**
-	 * 상품코드 생성
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	void createGoodsSequence(Goods goods);
-
-	/**
-	 * 상품 타이틀 관리 목록 건수
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	int getGoodsTitleReserveCount(GoodsSearch goodsSearch);
-
-	/**
-	 * 상품 타이틀 관리 목록
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	Collection<GoodsTnmRes> getGoodsTitleReserveList(GoodsSearch goodsSearch);
-
-	/**
-	 * 상품 타이틀 조회(기간 체크용)
-	 *
-	 * @param goodsTnmRes
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	int getGoodsTnmDupChkCount(GoodsTnmRes goodsTnmRes);
-
-	/**
-	 * 상품 타이틀 예약 등록
-	 *
-	 * @param goodsTnmRes
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	void createGoodTnmRes(GoodsTnmRes goodsTnmRes);
-
-	/**
-	 * 상품 타이틀 수정
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	void updateGoodTnm(Goods goods);
-
-	/**
-	 * 상품 타이틀 예약건 초기화
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	void updateGoodTnmInit(Goods goods);
-
-	/**
-	 * 상품 타이틀 예약 삭제
-	 *
-	 * @param goodsTnmRes
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	void deleteGoodTnmRes(GoodsTnmRes goodsTnmRes);
-
-	/**
-	 * 상품 타이틀 초기값 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	Goods getGoodTnmInit(Goods goods);
-
-	/**
-	 * 네이버 EP 제외 상품 목록 건수
-	 *
-	 * @param goodsSearch
-	 * @return Integer
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	int getGoodsEpSkipCount(GoodsSearch goodsSearch);
-
-	/**
-	 * 네이버 EP 제외 상품 목록
-	 *
-	 * @param goodsSearch
-	 * @return Collection<GoodsEpSkip>
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	Collection<GoodsEpSkip> getGoodsEpSkipList(GoodsSearch goodsSearch);
-
-	/**
-	 * 네이버 EP 제외 상품 조회(기간 체크용)
-	 *
-	 * @param GoodsEpSkip
-	 * @return Collection<GoodsEpSkip>
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	int getGoodsEpSkipDupChkCount(GoodsEpSkip GoodsEpSkip);
-
-	/**
-	 * 네이버 EP 제외 상품 예약 등록
-	 *
-	 * @param goodsEpSkip
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	void createGoodEpSkip(GoodsEpSkip goodsEpSkip);
-
-	/**
-	 * 네이버 EP 제외 상품 예약 삭제
-	 *
-	 * @param goodsEpSkip
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	void deleteGoodEpSkip(GoodsEpSkip goodsEpSkip);
-
-	/**
-	 * 상품 상세공지 목록
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 05
-	 */
-	Collection<Notice> getNoticeList(GoodsSearch goodsSearch);
-
-	/**
-	 * 상품 상세공지 상품 목록
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 06
-	 */
-	Collection<NoticeGoods> getNoticeGoodsList(Notice notice);
-
-	/**
-	 * 상품 상세공지 상품 저장
-	 *
-	 * @param noticeGoods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 06
-	 */
-	void saveNoticeGoods(NoticeGoods noticeGoods);
-
-	/**
-	 * 상품 상세공지 상품 삭제
-	 *
-	 * @param noticeGoods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 06
-	 */
-	void deleteNoticeGoods(NoticeGoods noticeGoods);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsCompose;
+import com.style24.persistence.domain.GoodsDesc;
+import com.style24.persistence.domain.GoodsEpSkip;
+import com.style24.persistence.domain.GoodsHst;
+import com.style24.persistence.domain.GoodsNotiInfo;
+import com.style24.persistence.domain.GoodsSearch;
+import com.style24.persistence.domain.GoodsTnmRes;
+import com.style24.persistence.domain.Itemkind;
+import com.style24.persistence.domain.NotiInfo;
+import com.style24.persistence.domain.Notice;
+import com.style24.persistence.domain.NoticeGoods;
+import com.style24.persistence.domain.Option;
+
+import com.gagaframework.web.parameter.GagaMap;
+
+/**
+ * 상품관리 Dao
+ *
+ * @author eskim
+ * @since 2020. 10. 16
+ */
+@ShopDs
+public interface TsaGoodsDao {
+
+	/**
+	 * 품목 목록
+	 * @param itemkind
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	Collection<Itemkind> getItemkindList(Itemkind itemkind);
+
+	/**
+	 * 품목 저장(등록/저장)
+	 * @param itemkind - 품목 정보
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	void saveItemkindInfo(Itemkind itemkind);
+
+	/**
+	 * 품목 삭제
+	 * @param itemkind - 품목 정보
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	void deleteItemkindInfo(Itemkind itemkind);
+
+	/**
+	 * 색상목록 조회
+	 *
+	 * @param color
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	Collection<Color> getColorList(Color color);
+
+	/**
+	 * 색상 저장
+	 * @param color
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	void saveColor(Color color);
+
+	/**
+	 * 상품정보고시 목록
+	 * @param notiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 19
+	 */
+	Collection<NotiInfo> getNotiInfoList(NotiInfo notiInfo);
+
+	/**
+	 * 상품정보고시 항목 목록
+	 * @param notiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 19
+	 */
+	Collection<NotiInfo> getNotiInfoItemList(NotiInfo notiInfo);
+
+	/**
+	 * 상품정보고시 상세 저장
+	 * @param notiInfo
+	 * @author eskim
+	 * @since 2010. 10. 19
+	 */
+	void saveNotiInfo(NotiInfo notiInfo);
+
+	/**
+	 * 상품 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 20
+	 */
+	int getGoodsListCount(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 20
+	 */
+	Collection<Goods> getGoodsList(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 목록 기본정보 엑셀다운로드
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	Collection<GagaMap> getGoodsInfoExcelList(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 이미지 필수 항목 입력 여부 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	Collection<Goods> getGoodsImgsYn(Goods goods);
+
+	/**
+	 * 상품 상세
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	Goods getGoods(Goods goods);
+
+	/**
+	 * 상품 상세 정보 조회
+	 *
+	 * @param goodsVideo
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	Collection<GoodsDesc> getGoodsDescList(GoodsDesc goodsDesc);
+
+	/**
+	 * 상품 정보 이력
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2019. 08. 12
+	 */
+	Collection<GoodsHst> getGoodsHstList(Goods goods);
+
+	/**
+	 * 상품 옵션 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 26
+	 */
+	Collection<Option> getGoodsSizeList(Goods goods);
+
+
+	/**
+	 * 상품 고시 조회
+	 *
+	 * @param goodsNotiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 12
+	 */
+	Collection<GoodsNotiInfo> getGoodsNotiInfoList(GoodsNotiInfo goodsNotiInfo);
+
+	/**
+	 * 구성상품 목록
+	 *
+	 * @param goodsNotiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods);
+
+	/**
+	 * 같은 품번 상품목록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	Collection<Goods> getGoodsNumGoodsList(Goods goods);
+
+	/**
+	 * 상품 기본 정보 이력 생성
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	void createGoodsHst(Goods goods);
+
+	/**
+	 * 상품 수정 항목 일괄변경
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	void updateGoodsState(Goods goods);
+
+	/**
+	 * 상품 품목변경
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	void updateGoodItemKindCd(Goods goods);
+
+	/**
+	 * 상품 자동 검색어 조회
+	 *
+	 * @param goodsCd
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	String getGoodsSnm(String goodsCd);
+
+	/**
+	 * 상품검색어 수정
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	void updateGoodsSnm(Goods goods);
+
+	/**
+	 * 상품 품목변경 고시정보 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	Collection<GoodsNotiInfo> getNewNotiInfo(Goods goods);
+
+	/**
+	 * 상품 품목변경 고시정보 삭제
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	void deleteGoodsNotiInfo(Goods goods);
+
+	/**
+	 * 상품 고시 정보 수정
+	 *
+	 * @param goodsNotiInfo
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	void saveGoodsNotiInfo(GoodsNotiInfo goodsNotiInfo);
+
+	/**
+	 * 상품 기본 정보 수정
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void updateGoods(Goods goods);
+
+	/**
+	 * 상품 상세정보 삭제
+	 *
+	 * @param godsDesc
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void deleteGoodsDesc(GoodsDesc godsDesc);
+
+	/**
+	 * 상품 상세정보 등록
+	 *
+	 * @param godsDesc
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void createGoodsDesc(GoodsDesc godsDesc);
+
+	/**
+	 * 구성상품 저장
+	 *
+	 * @param goodsCompose
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void saveGoodsCompose(GoodsCompose goodsCompose);
+
+	/**
+	 * 상품 옵션/재고 정보 이력생성
+	 *
+	 * @param option
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void createStockHst(Option option);
+
+	/**
+	 * 상품 옵션/재고 정보 수정
+	 *
+	 * @param stock
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	void saveStock(Option option);
+
+	/**
+	 * 상품 기본 정보 등록
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	void createGoods(Goods goods);
+
+	/**
+	 * 상품통계 생성
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	void createGoodsSmmary(Goods goods);
+
+//	/**
+//	 * 상품 품목별 매핑 카테고리 저장
+//	 *
+//	 * @param goods
+//	 * @author eskim
+//	 * @since 2020. 10. 30
+//	 */
+//	void createCategoryGoods(Goods goods);
+
+//	/**
+//	 * 상품 이미지 저장
+//	 *
+//	 * @param goodsImg
+//	 * @author eskim
+//	 * @since 2020. 10. 30
+//	 */
+//	void saveGoodsImgInfo(GoodsImg goodsImg);
+
+	/**
+	 * 상품코드 생성
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	void createGoodsSequence(Goods goods);
+
+	/**
+	 * 상품 타이틀 관리 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	int getGoodsTitleReserveCount(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 타이틀 관리 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	Collection<GoodsTnmRes> getGoodsTitleReserveList(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 타이틀 조회(기간 체크용)
+	 *
+	 * @param goodsTnmRes
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	int getGoodsTnmDupChkCount(GoodsTnmRes goodsTnmRes);
+
+	/**
+	 * 상품 타이틀 예약 등록
+	 *
+	 * @param goodsTnmRes
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	void createGoodTnmRes(GoodsTnmRes goodsTnmRes);
+
+	/**
+	 * 상품 타이틀 수정
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	void updateGoodTnm(Goods goods);
+
+	/**
+	 * 상품 타이틀 예약건 초기화
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	void updateGoodTnmInit(Goods goods);
+
+	/**
+	 * 상품 타이틀 예약 삭제
+	 *
+	 * @param goodsTnmRes
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	void deleteGoodTnmRes(GoodsTnmRes goodsTnmRes);
+
+	/**
+	 * 상품 타이틀 초기값 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	Goods getGoodTnmInit(Goods goods);
+
+	/**
+	 * 네이버 EP 제외 상품 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return Integer
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	int getGoodsEpSkipCount(GoodsSearch goodsSearch);
+
+	/**
+	 * 네이버 EP 제외 상품 목록
+	 *
+	 * @param goodsSearch
+	 * @return Collection<GoodsEpSkip>
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	Collection<GoodsEpSkip> getGoodsEpSkipList(GoodsSearch goodsSearch);
+
+	/**
+	 * 네이버 EP 제외 상품 조회(기간 체크용)
+	 *
+	 * @param GoodsEpSkip
+	 * @return Collection<GoodsEpSkip>
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	int getGoodsEpSkipDupChkCount(GoodsEpSkip GoodsEpSkip);
+
+	/**
+	 * 네이버 EP 제외 상품 예약 등록
+	 *
+	 * @param goodsEpSkip
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	void createGoodEpSkip(GoodsEpSkip goodsEpSkip);
+
+	/**
+	 * 네이버 EP 제외 상품 예약 삭제
+	 *
+	 * @param goodsEpSkip
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	void deleteGoodEpSkip(GoodsEpSkip goodsEpSkip);
+
+	/**
+	 * 상품 상세공지 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 05
+	 */
+	Collection<Notice> getNoticeList(GoodsSearch goodsSearch);
+
+	/**
+	 * 상품 상세공지 상품 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 06
+	 */
+	Collection<NoticeGoods> getNoticeGoodsList(Notice notice);
+
+	/**
+	 * 상품 상세공지 상품 저장
+	 *
+	 * @param noticeGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 06
+	 */
+	void saveNoticeGoods(NoticeGoods noticeGoods);
+
+	/**
+	 * 상품 상세공지 상품 삭제
+	 *
+	 * @param noticeGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 06
+	 */
+	void deleteNoticeGoods(NoticeGoods noticeGoods);
+
+}

+ 68 - 68
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaLoginDao.java

@@ -1,68 +1,68 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Menu;
-import com.style24.persistence.domain.User;
-
-/**
- * 운영관리 Dao
- * @author gagamel
- * @since 2019. 12. 4
- */
-@ShopDs
-public interface TsaLoginDao {
-
-	/**
-	 * ID로 사용자 정보 조회
-	 * @param userId - 사용자ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 5
-	 */
-	User getUserById(String userId);
-
-	/**
-	 * 로그인실패 남기기
-	 * @param user - 사용자정보
-	 * @author gagamel
-	 * @date 2020. 10. 5
-	 */
-	void createLoginFail(User user);
-
-	/**
-	 * 로그인 실패건수 조회
-	 * @param user - 사용자정보
-	 * @return 로그인 실패건수
-	 * @author gagamel
-	 * @date 2020. 10. 5
-	 */
-	int getLoginFailCount(User user);
-
-	/**
-	 * 최종로그인일시 Update
-	 * @param userNo - 사용자번호
-	 * @author gagamel
-	 * @since 2020. 10. 5
-	 */
-	void updateLastLoginDate(Integer userNo);
-
-	/**
-	 * 로그인이력 남기기
-	 * @param user - 사용자정보
-	 * @author gagamel
-	 * @date 2020. 10. 5
-	 */
-	void createLoginHistory(User user);
-
-	/**
-	 * 로그인 메뉴 목록
-	 * @param userNo - 사용자번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 5
-	 */
-	Collection<Menu> getLoginMenuList(Integer userNo);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Menu;
+import com.style24.persistence.domain.User;
+
+/**
+ * 운영관리 Dao
+ * @author gagamel
+ * @since 2019. 12. 4
+ */
+@ShopDs
+public interface TsaLoginDao {
+
+	/**
+	 * ID로 사용자 정보 조회
+	 * @param userId - 사용자ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 5
+	 */
+	User getUserById(String userId);
+
+	/**
+	 * 로그인실패 남기기
+	 * @param user - 사용자정보
+	 * @author gagamel
+	 * @date 2020. 10. 5
+	 */
+	void createLoginFail(User user);
+
+	/**
+	 * 로그인 실패건수 조회
+	 * @param user - 사용자정보
+	 * @return 로그인 실패건수
+	 * @author gagamel
+	 * @date 2020. 10. 5
+	 */
+	int getLoginFailCount(User user);
+
+	/**
+	 * 최종로그인일시 Update
+	 * @param userNo - 사용자번호
+	 * @author gagamel
+	 * @since 2020. 10. 5
+	 */
+	void updateLastLoginDate(Integer userNo);
+
+	/**
+	 * 로그인이력 남기기
+	 * @param user - 사용자정보
+	 * @author gagamel
+	 * @date 2020. 10. 5
+	 */
+	void createLoginHistory(User user);
+
+	/**
+	 * 로그인 메뉴 목록
+	 * @param userNo - 사용자번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 5
+	 */
+	Collection<Menu> getLoginMenuList(Integer userNo);
+
+}

+ 92 - 92
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaNoticeDao.java

@@ -1,92 +1,92 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Notice;
-
-/**
- * 공지사항 Dao
- * 
- * @author gagamel
- * @since 2020. 10. 30
- */
-@ShopDs
-public interface TsaNoticeDao {
-
-	/**
-	 * 공지사항 목록
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	Collection<Notice> getNoticeList(Notice notice);
-
-	/**
-	 * 공지사항 수신자 목록
-	 * @param noticeSq - 공지사항일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	Collection<Notice> getNoticeReceiverList(Integer noticeSq);
-
-	/**
-	 * 공지사항 파일 목록
-	 * @param noticeSq - 공지사항일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	Collection<Notice> getNoticeFileList(Integer noticeSq);
-
-	/**
-	 * 공지사항 저장
-	 * @param notice - 공지사항 정보
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	void createNotice(Notice notice);
-
-	/**
-	 * 공지사항 수정
-	 * @param notice - 공지사항 정보
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	void updateNotice(Notice notice);
-
-	/**
-	 * 공지사항 파일 저장
-	 * @param notice - 공지사항 정보
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	void createNoitceFlie(Notice notice);
-
-	/**
-	 * 공지사항 파일 삭제
-	 * @param notice - 공지사항 정보
-	 * @author jaewonHo
-	 * @since 2020. 01. 15
-	 */
-	void deleteNoticeFile(Notice notice);
-
-	/**
-	 * 공지사항 수신자 삭제
-	 * @param notice - 공지사항 정보
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	void deleteNoticeReceiver(Notice notice);
-
-	/**
-	 * 공지사항 수신자 저장
-	 * @param notice - 공지사항 정보
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	void createNoticeReceiver(Notice notice);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Notice;
+
+/**
+ * 공지사항 Dao
+ * 
+ * @author gagamel
+ * @since 2020. 10. 30
+ */
+@ShopDs
+public interface TsaNoticeDao {
+
+	/**
+	 * 공지사항 목록
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	Collection<Notice> getNoticeList(Notice notice);
+
+	/**
+	 * 공지사항 수신자 목록
+	 * @param noticeSq - 공지사항일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	Collection<Notice> getNoticeReceiverList(Integer noticeSq);
+
+	/**
+	 * 공지사항 파일 목록
+	 * @param noticeSq - 공지사항일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	Collection<Notice> getNoticeFileList(Integer noticeSq);
+
+	/**
+	 * 공지사항 저장
+	 * @param notice - 공지사항 정보
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	void createNotice(Notice notice);
+
+	/**
+	 * 공지사항 수정
+	 * @param notice - 공지사항 정보
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	void updateNotice(Notice notice);
+
+	/**
+	 * 공지사항 파일 저장
+	 * @param notice - 공지사항 정보
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	void createNoitceFlie(Notice notice);
+
+	/**
+	 * 공지사항 파일 삭제
+	 * @param notice - 공지사항 정보
+	 * @author jaewonHo
+	 * @since 2020. 01. 15
+	 */
+	void deleteNoticeFile(Notice notice);
+
+	/**
+	 * 공지사항 수신자 삭제
+	 * @param notice - 공지사항 정보
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	void deleteNoticeReceiver(Notice notice);
+
+	/**
+	 * 공지사항 수신자 저장
+	 * @param notice - 공지사항 정보
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	void createNoticeReceiver(Notice notice);
+
+}

+ 62 - 62
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaOcmDao.java

@@ -1,62 +1,62 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Extmall;
-import com.style24.persistence.domain.ExtmallNoti;
-import com.style24.persistence.domain.ExtmallPriceSync;
-
-/**
- * 영업망관리 Dao
- *
- * @author gagamel
- * @since 2020. 11. 5
- */
-@ShopDs
-public interface TsaOcmDao {
-
-	/**
-	 * 제휴몰 목록
-	 * @param extmall - 제휴몰 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	Collection<Extmall> getExtmallList(Extmall extmall);
-
-	/**
-	 * 제휴몰 등록/수정
-	 * @param extmall - 제휴몰 정보
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	void saveExtmall(Extmall extmall);
-
-	/**
-	 * 제휴몰 고시정보 목록
-	 * @param extmallNoti - 제휴몰고시정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 6
-	 */
-	Collection<ExtmallNoti> getExtmallNotiinfoList(ExtmallNoti extmallNoti);
-
-	/**
-	 * 제휴몰가격연계 목록
-	 * @param extmallPriceSync - 제휴몰가격연계 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	Collection<ExtmallPriceSync> getExtmallPriceSyncList(ExtmallPriceSync extmallPriceSync);
-
-	/**
-	 * 제휴몰가격연계 등록/수정
-	 * @param extmallPriceSync - 제휴몰가격연계 정보
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	void saveExtmallPriceSync(ExtmallPriceSync extmallPriceSync);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Extmall;
+import com.style24.persistence.domain.ExtmallNoti;
+import com.style24.persistence.domain.ExtmallPriceSync;
+
+/**
+ * 영업망관리 Dao
+ *
+ * @author gagamel
+ * @since 2020. 11. 5
+ */
+@ShopDs
+public interface TsaOcmDao {
+
+	/**
+	 * 제휴몰 목록
+	 * @param extmall - 제휴몰 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	Collection<Extmall> getExtmallList(Extmall extmall);
+
+	/**
+	 * 제휴몰 등록/수정
+	 * @param extmall - 제휴몰 정보
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	void saveExtmall(Extmall extmall);
+
+	/**
+	 * 제휴몰 고시정보 목록
+	 * @param extmallNoti - 제휴몰고시정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 6
+	 */
+	Collection<ExtmallNoti> getExtmallNotiinfoList(ExtmallNoti extmallNoti);
+
+	/**
+	 * 제휴몰가격연계 목록
+	 * @param extmallPriceSync - 제휴몰가격연계 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	Collection<ExtmallPriceSync> getExtmallPriceSyncList(ExtmallPriceSync extmallPriceSync);
+
+	/**
+	 * 제휴몰가격연계 등록/수정
+	 * @param extmallPriceSync - 제휴몰가격연계 정보
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	void saveExtmallPriceSync(ExtmallPriceSync extmallPriceSync);
+
+}

+ 226 - 226
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaRendererDao.java

@@ -1,226 +1,226 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Brand;
-import com.style24.persistence.domain.Color;
-import com.style24.persistence.domain.CommonCode;
-import com.style24.persistence.domain.DeliveryLoc;
-import com.style24.persistence.domain.Itemkind;
-import com.style24.persistence.domain.SupplyCompany;
-
-/**
- * 콤보박스, 체크박스, 라디오버튼 구성 시 필요한 Renderer Dao
- *
- * @author gagamel
- * @since 2020. 10. 7
- */
-@ShopDs
-public interface TsaRendererDao {
-
-	/**
-	 * 공급업체 목록
-	 * @param supplyComp
-	 * @return 공급업체 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	Collection<CommonCode> getSupplyCompanyList(SupplyCompany supplyComp);
-
-	/**
-	 * 공통코드 목록
-	 * @param commoncode - 공통코드 정보
-	 * @return 공통코드 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	Collection<CommonCode> getCommonCodeList(CommonCode commoncode);
-
-	/**
-	 * 최상위메뉴 목록
-	 * @param pmenuId - 상위메뉴ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	Collection<CommonCode> getTopMenuList(String pmenuId);
-
-	/**
-	 * 전체 메뉴 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	Collection<CommonCode> getAllMenuList();
-
-//	/**
-//	 * 벤더외부몰 목록
-//	 * @param vendorId - 벤더ID
-//	 * @return 벤더외부몰 목록
-//	 * @author gagamel
-//	 * @since 2019. 12. 6
-//	 */
-//	Collection<CommonCode> getVendorExtmallList(String vendorId);
-//
-//	/**
-//	 * 벤더외부몰판매매장 목록
-//	 * @param vendorId - 벤더ID
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 4. 28
-//	 */
-//	Collection<CommonCode> getVendorExtmallSellStoreList(String vendorId);
-//
-	/**
-	 * 브랜드 목록
-	 * @param brand --브랜드 정보
-	 * @return 브랜드 목록
-	 * @author eskim
-	 * @since 2020. 10. 20
-	 */
-	Collection<CommonCode> getBrandList(Brand brand);
-
-	/**
-	 * 권한별 브랜드 목록
-	 * @param userId - 사용자ID
-	 * @return
-	 * @author eskim
-	 * @since 2019. 6.17
-	 */
-	Collection<CommonCode> getAuthBrandList(int userNo);
-
-	/**
-	 * 출고처 목록
-	 * @param delvLoc - 출고처 정보
-	 * @return 출고처 목록
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	Collection<CommonCode> getDeliveryLocList(DeliveryLoc delvLoc);
-
-//	/**
-//	 * 정보고시 목록
-//	 * @param goodsCd
-//	 * @return
-//	 * @author jaewonHo
-//	 * @param goodsCd
-//	 * @since 2019. 12. 6
-//	 */
-//	Collection<CommonCode> getCateInfoList(String goodsCd);
-//
-	/**
-	 * 품목 목록
-	 * @param itemkind
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 19
-	 */
-	Collection<CommonCode> getItemkindList(Itemkind itemkind);
-
-//	/**
-//	 * 브랜드그룹 목록
-//	 * @return
-//	 * @author eskim
-//	 * @since 2019. 12. 10
-//	 */
-//	Collection<CommonCode> getBrandGroupList();
-//
-	/**
-	 * 컬러 목록
-	 * @param color
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	Collection<CommonCode> getColorList(Color color);
-
-//
-//	/**
-//	 * 사용중 대카테고리 목록
-//	 * @param cateGb
-//	 * @return
-//	 * @author sasa004
-//	 * @since 2020. 01. 02
-//	 */
-//	Collection<CommonCode> getTCategoryList(String cateGb);
-//
-	/**
-	 * 브랜드에 등록된 MD 목록
-	 * @return MD 목록
-	 * @author eskim
-	 * @since 2020. 10. 19
-	 */
-	Collection<CommonCode> getBrandMdList();
-
-	/**
-	 * 택배사명 목록 조회
-	 * @return CommonCode
-	 * @author moon
-	 * @since 2020. 11. 05
-	 */
-	Collection<CommonCode> getShipCompanyList();
-//
-//	/**
-//	 * MD별 브랜드 목록 조회
-//	 * @param mdId
-//	 * @return CommonCode
-//	 * @author jaewonHo
-//	 * @since 2020. 02. 04
-//	 */
-//	Collection<CommonCode> getMdBrandList(String mdId);
-//
-//	/**
-//	 * MD별 브랜드 목록 조회
-//	 * @param mdId
-//	 * @return CommonCode
-//	 * @author jaewonHo
-//	 * @since 2020. 02. 04
-//	 */
-//	Collection<CommonCode> getMdBrandGrpList(String mdId);
-//
-//	/**
-//	 * 인스타그램 계정리스트 조회
-//	 * @return Collection<CommonCode>
-//	 * @author 이명철
-//	 * @since 2020. 3. 18.
-//	 */
-//	Collection<CommonCode> getInstaAccount();
-//
-//	/**
-//	 * 판매몰조회
-//	 * @return
-//	 * @author swkim
-//	 * @since 2020. 03. 19
-//	 */
-//	Collection<CommonCode> getSellStoreList();
-//
-//	/**
-//	 * 기본답변문구 제목 조회
-//	 * @param ansClsf
-//	 * @return
-//	 * @author yujung
-//	 * @since 2020. 04. 02
-//	 */
-//	Collection<CommonCode> getBasicAnsTitleList(String ansClsf);
-//
-//	/**
-//	 * 제휴링크 목록
-//	 * @param afChannel - 제휴채널
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 5. 4
-//	 */
-//	Collection<CommonCode> getAflinkList(String afChannel);
-
-	/**
-	 * 색상그룹코드 RGB 목록
-	 *
-	 * @param
-	 * @return 코드설명 목록
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	Collection<CommonCode> getColorGrpCdRgbList();
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.DeliveryLoc;
+import com.style24.persistence.domain.Itemkind;
+import com.style24.persistence.domain.SupplyCompany;
+
+/**
+ * 콤보박스, 체크박스, 라디오버튼 구성 시 필요한 Renderer Dao
+ *
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@ShopDs
+public interface TsaRendererDao {
+
+	/**
+	 * 공급업체 목록
+	 * @param supplyComp
+	 * @return 공급업체 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	Collection<CommonCode> getSupplyCompanyList(SupplyCompany supplyComp);
+
+	/**
+	 * 공통코드 목록
+	 * @param commoncode - 공통코드 정보
+	 * @return 공통코드 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	Collection<CommonCode> getCommonCodeList(CommonCode commoncode);
+
+	/**
+	 * 최상위메뉴 목록
+	 * @param pmenuId - 상위메뉴ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	Collection<CommonCode> getTopMenuList(String pmenuId);
+
+	/**
+	 * 전체 메뉴 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	Collection<CommonCode> getAllMenuList();
+
+//	/**
+//	 * 벤더외부몰 목록
+//	 * @param vendorId - 벤더ID
+//	 * @return 벤더외부몰 목록
+//	 * @author gagamel
+//	 * @since 2019. 12. 6
+//	 */
+//	Collection<CommonCode> getVendorExtmallList(String vendorId);
+//
+//	/**
+//	 * 벤더외부몰판매매장 목록
+//	 * @param vendorId - 벤더ID
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 4. 28
+//	 */
+//	Collection<CommonCode> getVendorExtmallSellStoreList(String vendorId);
+//
+	/**
+	 * 브랜드 목록
+	 * @param brand --브랜드 정보
+	 * @return 브랜드 목록
+	 * @author eskim
+	 * @since 2020. 10. 20
+	 */
+	Collection<CommonCode> getBrandList(Brand brand);
+
+	/**
+	 * 권한별 브랜드 목록
+	 * @param userId - 사용자ID
+	 * @return
+	 * @author eskim
+	 * @since 2019. 6.17
+	 */
+	Collection<CommonCode> getAuthBrandList(int userNo);
+
+	/**
+	 * 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return 출고처 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	Collection<CommonCode> getDeliveryLocList(DeliveryLoc delvLoc);
+
+//	/**
+//	 * 정보고시 목록
+//	 * @param goodsCd
+//	 * @return
+//	 * @author jaewonHo
+//	 * @param goodsCd
+//	 * @since 2019. 12. 6
+//	 */
+//	Collection<CommonCode> getCateInfoList(String goodsCd);
+//
+	/**
+	 * 품목 목록
+	 * @param itemkind
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 19
+	 */
+	Collection<CommonCode> getItemkindList(Itemkind itemkind);
+
+//	/**
+//	 * 브랜드그룹 목록
+//	 * @return
+//	 * @author eskim
+//	 * @since 2019. 12. 10
+//	 */
+//	Collection<CommonCode> getBrandGroupList();
+//
+	/**
+	 * 컬러 목록
+	 * @param color
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	Collection<CommonCode> getColorList(Color color);
+
+//
+//	/**
+//	 * 사용중 대카테고리 목록
+//	 * @param cateGb
+//	 * @return
+//	 * @author sasa004
+//	 * @since 2020. 01. 02
+//	 */
+//	Collection<CommonCode> getTCategoryList(String cateGb);
+//
+	/**
+	 * 브랜드에 등록된 MD 목록
+	 * @return MD 목록
+	 * @author eskim
+	 * @since 2020. 10. 19
+	 */
+	Collection<CommonCode> getBrandMdList();
+
+	/**
+	 * 택배사명 목록 조회
+	 * @return CommonCode
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	Collection<CommonCode> getShipCompanyList();
+//
+//	/**
+//	 * MD별 브랜드 목록 조회
+//	 * @param mdId
+//	 * @return CommonCode
+//	 * @author jaewonHo
+//	 * @since 2020. 02. 04
+//	 */
+//	Collection<CommonCode> getMdBrandList(String mdId);
+//
+//	/**
+//	 * MD별 브랜드 목록 조회
+//	 * @param mdId
+//	 * @return CommonCode
+//	 * @author jaewonHo
+//	 * @since 2020. 02. 04
+//	 */
+//	Collection<CommonCode> getMdBrandGrpList(String mdId);
+//
+//	/**
+//	 * 인스타그램 계정리스트 조회
+//	 * @return Collection<CommonCode>
+//	 * @author 이명철
+//	 * @since 2020. 3. 18.
+//	 */
+//	Collection<CommonCode> getInstaAccount();
+//
+//	/**
+//	 * 판매몰조회
+//	 * @return
+//	 * @author swkim
+//	 * @since 2020. 03. 19
+//	 */
+//	Collection<CommonCode> getSellStoreList();
+//
+//	/**
+//	 * 기본답변문구 제목 조회
+//	 * @param ansClsf
+//	 * @return
+//	 * @author yujung
+//	 * @since 2020. 04. 02
+//	 */
+//	Collection<CommonCode> getBasicAnsTitleList(String ansClsf);
+//
+//	/**
+//	 * 제휴링크 목록
+//	 * @param afChannel - 제휴채널
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 5. 4
+//	 */
+//	Collection<CommonCode> getAflinkList(String afChannel);
+
+	/**
+	 * 색상그룹코드 RGB 목록
+	 *
+	 * @param
+	 * @return 코드설명 목록
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	Collection<CommonCode> getColorGrpCdRgbList();
+
+}

+ 237 - 237
style24.admin/src/main/java/com/style24/admin/biz/dao/TsaSystemDao.java

@@ -1,237 +1,237 @@
-package com.style24.admin.biz.dao;
-
-import java.util.Collection;
-
-import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.CommonCode;
-import com.style24.persistence.domain.Menu;
-import com.style24.persistence.domain.MenuAccessHst;
-import com.style24.persistence.domain.MenuRole;
-import com.style24.persistence.domain.SampleFile;
-import com.style24.persistence.domain.User;
-import com.style24.persistence.domain.UserHst;
-import com.style24.persistence.domain.UserMenu;
-
-/**
- * 시스템 Dao
- *
- * @author gagamel
- * @since 2020. 10. 7
- */
-@ShopDs
-public interface TsaSystemDao {
-
-	/**
-	 * 사용자 목록
-	 * @param user - 사용자 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	Collection<User> getUserList(User user);
-
-	/**
-	 * 사용자 정보 조회
-	 * @param userNo - 사용자번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	User getUser(Integer userNo);
-
-	/**
-	 * 사용자 삭제
-	 * @param user - 사용자 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void deleteUser(User user);
-
-	/**
-	 * 사용자ID 건수 조회
-	 * @param userId - 사용자ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	int getUserIdCount(String userId);
-
-	/**
-	 * 사용자 정보 저장 처리
-	 * @param user - 사용자 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void saveUser(User user);
-
-	/**
-	 * 임시비밀번호 조회
-	 * @param length - 비밀번호 자릿수
-	 * @return
-	 * @since 2020. 10. 7
-	 */
-	String getTemporaryPassword(int length);
-
-	/**
-	 * 사용자 비밀번호 수정
-	 * @param user - 사용자 정보
-	 * @since 2020. 10. 7
-	 */
-	void updateUserPassword(User user);
-
-	/**
-	 * 사용자 메뉴 목록
-	 * @param userNo - 사용자번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	Collection<UserMenu> getUserMenuList(Integer userNo);
-
-	/**
-	 * 사용자정보변경이력 생성
-	 * @param userHst - 사용자이력 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void createUserInfoChangeHistory(UserHst userHst);
-
-	/**
-	 * 메뉴 목록
-	 * @param menu - 메뉴정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	Collection<Menu> getMenuList(Menu menu);
-
-	/**
-	 * 메뉴 등록/수정
-	 * @param menu - 메뉴 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void saveMenu(Menu menu);
-
-	/**
-	 * 메뉴권한 삭제
-	 * @param menuId - 메뉴ID
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void deleteMenuRole(String menuId);
-
-	/**
-	 * 메뉴권한 생성
-	 * @param menuRole - 메뉴권한 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void createMenuRole(MenuRole menuRole);
-
-	/**
-	 * 전체 사용자 메뉴 삭제
-	 * @param menuRole - 메뉴권한 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void deleteAllUserMenu(MenuRole menuRole);
-
-	/**
-	 * 전체 사용자 메뉴 생성
-	 * @param menuRole - 메뉴권한 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void createAllUserMenu(MenuRole menuRole);
-
-	/**
-	 * 사용자 전체 메뉴 삭제
-	 * @param userNo - 사용자번호
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void deleteUserAllMenu(Integer userNo);
-
-	/**
-	 * 사용자 전체 메뉴 생성
-	 * @param user - 사용자 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void createUserAllMenu(User user);
-
-	/**
-	 * 사용자 메뉴 삭제
-	 * @param userMenu - 사용자 메뉴 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void deleteAdminUserMenu(UserMenu userMenu);
-
-	/**
-	 * 사용자 메뉴 생성
-	 * @param userMenu - 사용자 메뉴 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void createUserMenu(UserMenu userMenu);
-
-	/**
-	 * 공통코드 목록
-	 * @param commoncode - 공통코드 정보
-	 * @return 공통코드 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	Collection<CommonCode> getCommonCodeList(CommonCode commoncode);
-
-	/**
-	 * 메뉴접속이력 생성
-	 * @param menuAccessHst - 메뉴접속 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void createMenuAccessHistory(MenuAccessHst menuAccessHst);
-
-	/**
-	 * 공통코드 등록/수정
-	 * @param commoncode - 공통코드 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void saveCommonCode(CommonCode commoncode);
-
-	/**
-	 * 공통코드 삭제
-	 * @param commoncode - 공통코드 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	void deleteCommonCode(CommonCode commoncode);
-
-	/**
-	 * 샘플파일 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	Collection<SampleFile> getSampleFileList();
-
-	/**
-	 * 샘플파일 등록
-	 * @param sampleFile - 샘플파일 정보
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	void createSampleFile(SampleFile sampleFile);
-
-	/**
-	 * 샘플파일 수정
-	 * @param sampleFile - 샘플파일 정보
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	void updateSampleFile(SampleFile sampleFile);
-
-}
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.Menu;
+import com.style24.persistence.domain.MenuAccessHst;
+import com.style24.persistence.domain.MenuRole;
+import com.style24.persistence.domain.SampleFile;
+import com.style24.persistence.domain.User;
+import com.style24.persistence.domain.UserHst;
+import com.style24.persistence.domain.UserMenu;
+
+/**
+ * 시스템 Dao
+ *
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@ShopDs
+public interface TsaSystemDao {
+
+	/**
+	 * 사용자 목록
+	 * @param user - 사용자 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	Collection<User> getUserList(User user);
+
+	/**
+	 * 사용자 정보 조회
+	 * @param userNo - 사용자번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	User getUser(Integer userNo);
+
+	/**
+	 * 사용자 삭제
+	 * @param user - 사용자 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void deleteUser(User user);
+
+	/**
+	 * 사용자ID 건수 조회
+	 * @param userId - 사용자ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	int getUserIdCount(String userId);
+
+	/**
+	 * 사용자 정보 저장 처리
+	 * @param user - 사용자 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void saveUser(User user);
+
+	/**
+	 * 임시비밀번호 조회
+	 * @param length - 비밀번호 자릿수
+	 * @return
+	 * @since 2020. 10. 7
+	 */
+	String getTemporaryPassword(int length);
+
+	/**
+	 * 사용자 비밀번호 수정
+	 * @param user - 사용자 정보
+	 * @since 2020. 10. 7
+	 */
+	void updateUserPassword(User user);
+
+	/**
+	 * 사용자 메뉴 목록
+	 * @param userNo - 사용자번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	Collection<UserMenu> getUserMenuList(Integer userNo);
+
+	/**
+	 * 사용자정보변경이력 생성
+	 * @param userHst - 사용자이력 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void createUserInfoChangeHistory(UserHst userHst);
+
+	/**
+	 * 메뉴 목록
+	 * @param menu - 메뉴정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	Collection<Menu> getMenuList(Menu menu);
+
+	/**
+	 * 메뉴 등록/수정
+	 * @param menu - 메뉴 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void saveMenu(Menu menu);
+
+	/**
+	 * 메뉴권한 삭제
+	 * @param menuId - 메뉴ID
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void deleteMenuRole(String menuId);
+
+	/**
+	 * 메뉴권한 생성
+	 * @param menuRole - 메뉴권한 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void createMenuRole(MenuRole menuRole);
+
+	/**
+	 * 전체 사용자 메뉴 삭제
+	 * @param menuRole - 메뉴권한 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void deleteAllUserMenu(MenuRole menuRole);
+
+	/**
+	 * 전체 사용자 메뉴 생성
+	 * @param menuRole - 메뉴권한 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void createAllUserMenu(MenuRole menuRole);
+
+	/**
+	 * 사용자 전체 메뉴 삭제
+	 * @param userNo - 사용자번호
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void deleteUserAllMenu(Integer userNo);
+
+	/**
+	 * 사용자 전체 메뉴 생성
+	 * @param user - 사용자 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void createUserAllMenu(User user);
+
+	/**
+	 * 사용자 메뉴 삭제
+	 * @param userMenu - 사용자 메뉴 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void deleteAdminUserMenu(UserMenu userMenu);
+
+	/**
+	 * 사용자 메뉴 생성
+	 * @param userMenu - 사용자 메뉴 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void createUserMenu(UserMenu userMenu);
+
+	/**
+	 * 공통코드 목록
+	 * @param commoncode - 공통코드 정보
+	 * @return 공통코드 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	Collection<CommonCode> getCommonCodeList(CommonCode commoncode);
+
+	/**
+	 * 메뉴접속이력 생성
+	 * @param menuAccessHst - 메뉴접속 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void createMenuAccessHistory(MenuAccessHst menuAccessHst);
+
+	/**
+	 * 공통코드 등록/수정
+	 * @param commoncode - 공통코드 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void saveCommonCode(CommonCode commoncode);
+
+	/**
+	 * 공통코드 삭제
+	 * @param commoncode - 공통코드 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	void deleteCommonCode(CommonCode commoncode);
+
+	/**
+	 * 샘플파일 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	Collection<SampleFile> getSampleFileList();
+
+	/**
+	 * 샘플파일 등록
+	 * @param sampleFile - 샘플파일 정보
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	void createSampleFile(SampleFile sampleFile);
+
+	/**
+	 * 샘플파일 수정
+	 * @param sampleFile - 샘플파일 정보
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	void updateSampleFile(SampleFile sampleFile);
+
+}

+ 53 - 53
style24.admin/src/main/java/com/style24/admin/biz/service/TsaAnswerPhaseService.java

@@ -1,53 +1,53 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.style24.admin.biz.dao.TsaAnswerPhaseDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.persistence.domain.AnswerPhase;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 답변문구 Service
- *
- * @author gagamel
- * @since 2020. 10. 29
- */
-@Service
-@Slf4j
-public class TsaAnswerPhaseService {
-
-	@Autowired
-	private TsaAnswerPhaseDao ansPhaseDao;
-
-	/**
-	 * 답변문구 목록
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	public Collection<AnswerPhase> getAnswerPhaseList(AnswerPhase ansPhase) {
-		return ansPhaseDao.getAnswerPhaseList(ansPhase);
-	}
-
-	/**
-	 * 답변문구 등록/수정
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@Transactional("shopTxnManager")
-	public void saveAnswerPhase(AnswerPhase ansPhase) {
-		ansPhase.setRegNo(TsaSession.getInfo().getUserNo());
-		ansPhase.setUpdNo(TsaSession.getInfo().getUserNo());
-		ansPhaseDao.saveAnswerPhase(ansPhase);
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaAnswerPhaseDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.AnswerPhase;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 답변문구 Service
+ *
+ * @author gagamel
+ * @since 2020. 10. 29
+ */
+@Service
+@Slf4j
+public class TsaAnswerPhaseService {
+
+	@Autowired
+	private TsaAnswerPhaseDao ansPhaseDao;
+
+	/**
+	 * 답변문구 목록
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	public Collection<AnswerPhase> getAnswerPhaseList(AnswerPhase ansPhase) {
+		return ansPhaseDao.getAnswerPhaseList(ansPhase);
+	}
+
+	/**
+	 * 답변문구 등록/수정
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@Transactional("shopTxnManager")
+	public void saveAnswerPhase(AnswerPhase ansPhase) {
+		ansPhase.setRegNo(TsaSession.getInfo().getUserNo());
+		ansPhase.setUpdNo(TsaSession.getInfo().getUserNo());
+		ansPhaseDao.saveAnswerPhase(ansPhase);
+	}
+
+}

+ 326 - 326
style24.admin/src/main/java/com/style24/admin/biz/service/TsaBusinessService.java

@@ -1,326 +1,326 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.style24.admin.biz.dao.TsaBusinessDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Aflink;
-import com.style24.persistence.domain.Brand;
-import com.style24.persistence.domain.BrandMd;
-import com.style24.persistence.domain.DeliveryLoc;
-import com.style24.persistence.domain.SellStore;
-import com.style24.persistence.domain.ShipCompany;
-import com.style24.persistence.domain.SiteBrand;
-import com.style24.persistence.domain.StockSyncBase;
-import com.style24.persistence.domain.SupplyCompany;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 영업관리 Service
- *
- * @author gagamel
- * @since 2020. 10. 14
- */
-@Service
-@Slf4j
-public class TsaBusinessService {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private TsaBusinessDao businessDao;
-
-	/**
-	 * 공급업체 목록
-	 * @param supplyComp - 공급업체 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 14
-	 */
-	public Collection<SupplyCompany> getSupplyCompanyList(SupplyCompany supplyComp) {
-		return businessDao.getSupplyCompanyList(supplyComp);
-	}
-
-	/**
-	 * 공급업체 저장 처리
-	 * @param supplyComp - 공급업체 정보
-	 * @author gagamel
-	 * @since 2020. 10. 14
-	 */
-	public void saveSupplyCompany(SupplyCompany supplyComp) {
-		if (StringUtils.isNotBlank(supplyComp.getSupplyCompCd())) {
-			businessDao.updateSupplyCompany(supplyComp);
-		} else {
-			businessDao.createSupplyCompany(supplyComp);
-		}
-	}
-
-	/**
-	 * 출고처 목록
-	 * @param delvLoc - 출고처 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 16
-	 **/
-	public Collection<DeliveryLoc> getDeliveryLocList(DeliveryLoc delvLoc) {
-		return businessDao.getDeliveryLocList(delvLoc);
-	}
-
-	/**
-	 * 출고처 저장
-	 * @param delvLoc - 출고처 정보
-	 * @author gagamel
-	 * @since 2020. 10. 16
-	 */
-	@Transactional("shopTxnManager")
-	public void saveDeliveryLoc(DeliveryLoc delvLoc) {
-		if (StringUtils.isEmpty(delvLoc.getUseYn())) {
-			delvLoc.setUseYn("N");
-		}
-
-		businessDao.saveDeliveryLoc(delvLoc);
-	}
-
-	/**
-	 * 브랜드 목록
-	 * @param brand - 브랜드 정보
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	public Collection<Brand> getBrandList(Brand brand) {
-		return businessDao.getBrandList(brand);
-	}
-
-	/**
-	 * 담당MD 목록
-	 * @param brandMd - 담당MD 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	public Collection<BrandMd> getMdList(BrandMd brandMd) {
-		return businessDao.getMdList(brandMd);
-	}
-
-	/**
-	 * 브랜드담당MD 목록
-	 * @param brandCd - 브랜드코드
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	public Collection<BrandMd> getBrandMdList(String brandCd) {
-		return businessDao.getBrandMdList(brandCd);
-	}
-
-	/**
-	 * 브랜드담당MD 목록 등록/수정 처리
-	 * @param brandMdList - 브랜드담당MD 목록
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@Transactional("shopTxnManager")
-	public void saveBrandMdList(Collection<BrandMd> brandMdList) {
-		businessDao.deleteBrandMd(brandMdList.iterator().next().getBrandCd());
-
-		for (BrandMd brandMd : brandMdList) {
-			brandMd.setRegNo(TsaSession.getInfo().getUserNo());
-			brandMd.setUpdNo(TsaSession.getInfo().getUserNo());
-			businessDao.createBrandMd(brandMd);
-		}
-	}
-
-	/**
-	 * 브랜드 노출사이트 목록
-	 * @param brandCd - 브랜드코드
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	public Collection<SiteBrand> getBrandSiteList(String brandCd) {
-		return businessDao.getBrandSiteList(brandCd);
-	}
-
-	/**
-	 * 브랜드 노출사이트 등록/수정 처리
-	 * @param siteBrandList - 브랜드사이트 목록
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@Transactional("shopTxnManager")
-	public void saveBrandSiteList(Collection<SiteBrand> siteBrandList) {
-		for (SiteBrand siteBrand : siteBrandList) {
-			siteBrand.setRegNo(TsaSession.getInfo().getUserNo());
-			siteBrand.setUpdNo(TsaSession.getInfo().getUserNo());
-//			siteBrand.setTcateCd(businessDao.getTcateCdByBrand(siteBrand));
-			businessDao.saveBrandSite(siteBrand);
-		}
-	}
-
-	/**
-	 * 브랜드 등록/수정
-	 * @param brand - 브랜드 정보
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	@Transactional("shopTxnManager")
-	public void saveBrand(Brand brand) {
-		if (brand.getMode().equals("N")) { // 신규
-			businessDao.createBrand(brand);
-		} else { // 수정
-			businessDao.updateBrand(brand);
-		}
-	}
-
-	/**
-	 * 재고연계관리 - 출고처 목록
-	 * @param delvLoc - 출고처 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	public Collection<DeliveryLoc> getStockSyncDeliveryLocList(DeliveryLoc delvLoc) {
-		return businessDao.getStockSyncDeliveryLocList(delvLoc);
-	}
-
-	/**
-	 * 재고연계관리 - 재고연계기준 목록
-	 * @param stockSyncBase - 재고연계기준 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	public Collection<StockSyncBase> getStockSyncBaseList(StockSyncBase stockSyncBase) {
-		return businessDao.getStockSyncBaseList(stockSyncBase);
-	}
-
-	/**
-	 * 재고연계관리 - 재고연계기준 저장
-	 * @param stockSyncBase - 재고연계기준 정보
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	public void saveStockSyncBaseList(Collection<StockSyncBase> stockSyncBaseList) {
-		for (StockSyncBase stockSyncBase : stockSyncBaseList) {
-			stockSyncBase.setRegNo(TsaSession.getInfo().getUserNo());
-			stockSyncBase.setUpdNo(TsaSession.getInfo().getUserNo());
-			businessDao.saveStockSyncBase(stockSyncBase);
-		}
-	}
-
-	/**
-	 * 판매매장 목록
-	 * @param sellStore - 판매매장 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	public Collection<SellStore> getSellStoreList(SellStore sellStore) {
-		return businessDao.getSellStoreList(sellStore);
-	}
-
-	/**
-	 * 판매매장 목록 저장 처리
-	 * @param sellStoreList - 판매매장 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@Transactional("shopTxnManager")
-	public void saveSellStoreList(Collection<SellStore> sellStoreList) {
-		for (SellStore sellStore : sellStoreList) {
-			sellStore.setRegNo(TsaSession.getInfo().getUserNo());
-			sellStore.setUpdNo(TsaSession.getInfo().getUserNo());
-			businessDao.saveSellStore(sellStore);
-		}
-	}
-
-	/**
-	 * 제휴링크 목록
-	 * @param aflink - 제휴링크 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	public Collection<Aflink> getAflinkList(Aflink aflink) {
-		return businessDao.getAflinkList(aflink);
-	}
-
-	/**
-	 * 제휴링크 등록/수정
-	 * @param aflink - 제휴링크 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@Transactional("shopTxnManager")
-	public void saveAflink(Aflink aflink) {
-		aflink.setRegNo(TsaSession.getInfo().getUserNo());
-		aflink.setUpdNo(TsaSession.getInfo().getUserNo());
-		businessDao.saveAflink(aflink);
-	}
-
-	/**
-	 * 제휴링크 목록 삭제 처리
-	 * @param aflinkList - 제휴링크 목록
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteAflinkList(Collection<Aflink> aflinkList) {
-		for (Aflink aflink : aflinkList) {
-			aflink.setUpdNo(TsaSession.getInfo().getUserNo());
-			businessDao.deleteAflink(aflink);
-		}
-	}
-
-	/**
-	 * 배송업체 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	public Collection<ShipCompany> getShipCompanyList() {
-		return businessDao.getShipCompanyList();
-	}
-
-	/**
-	 * 배송업체 목록 저장
-	 * @param shipCompList - 배송업체 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@Transactional("shopTxnManager")
-	public void saveShipCompanyList(Collection<ShipCompany> shipCompList) {
-		for (ShipCompany shipComp : shipCompList) {
-			shipComp.setRegNo(TsaSession.getInfo().getUserNo());
-			shipComp.setUpdNo(TsaSession.getInfo().getUserNo());
-			businessDao.saveShipCompany(shipComp);
-		}
-	}
-
-	/**
-	 * 배송업체 목록 삭제
-	 * @param shipCompList - 배송업체 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteShipCompanyList(Collection<ShipCompany> shipCompList) {
-		for (ShipCompany shipComp : shipCompList) {
-			shipComp.setUpdNo(TsaSession.getInfo().getUserNo());
-			businessDao.deleteShipCompany(shipComp);
-		}
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaBusinessDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Aflink;
+import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.BrandMd;
+import com.style24.persistence.domain.DeliveryLoc;
+import com.style24.persistence.domain.SellStore;
+import com.style24.persistence.domain.ShipCompany;
+import com.style24.persistence.domain.SiteBrand;
+import com.style24.persistence.domain.StockSyncBase;
+import com.style24.persistence.domain.SupplyCompany;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 영업관리 Service
+ *
+ * @author gagamel
+ * @since 2020. 10. 14
+ */
+@Service
+@Slf4j
+public class TsaBusinessService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaBusinessDao businessDao;
+
+	/**
+	 * 공급업체 목록
+	 * @param supplyComp - 공급업체 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 14
+	 */
+	public Collection<SupplyCompany> getSupplyCompanyList(SupplyCompany supplyComp) {
+		return businessDao.getSupplyCompanyList(supplyComp);
+	}
+
+	/**
+	 * 공급업체 저장 처리
+	 * @param supplyComp - 공급업체 정보
+	 * @author gagamel
+	 * @since 2020. 10. 14
+	 */
+	public void saveSupplyCompany(SupplyCompany supplyComp) {
+		if (StringUtils.isNotBlank(supplyComp.getSupplyCompCd())) {
+			businessDao.updateSupplyCompany(supplyComp);
+		} else {
+			businessDao.createSupplyCompany(supplyComp);
+		}
+	}
+
+	/**
+	 * 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 16
+	 **/
+	public Collection<DeliveryLoc> getDeliveryLocList(DeliveryLoc delvLoc) {
+		return businessDao.getDeliveryLocList(delvLoc);
+	}
+
+	/**
+	 * 출고처 저장
+	 * @param delvLoc - 출고처 정보
+	 * @author gagamel
+	 * @since 2020. 10. 16
+	 */
+	@Transactional("shopTxnManager")
+	public void saveDeliveryLoc(DeliveryLoc delvLoc) {
+		if (StringUtils.isEmpty(delvLoc.getUseYn())) {
+			delvLoc.setUseYn("N");
+		}
+
+		businessDao.saveDeliveryLoc(delvLoc);
+	}
+
+	/**
+	 * 브랜드 목록
+	 * @param brand - 브랜드 정보
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	public Collection<Brand> getBrandList(Brand brand) {
+		return businessDao.getBrandList(brand);
+	}
+
+	/**
+	 * 담당MD 목록
+	 * @param brandMd - 담당MD 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<BrandMd> getMdList(BrandMd brandMd) {
+		return businessDao.getMdList(brandMd);
+	}
+
+	/**
+	 * 브랜드담당MD 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<BrandMd> getBrandMdList(String brandCd) {
+		return businessDao.getBrandMdList(brandCd);
+	}
+
+	/**
+	 * 브랜드담당MD 목록 등록/수정 처리
+	 * @param brandMdList - 브랜드담당MD 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@Transactional("shopTxnManager")
+	public void saveBrandMdList(Collection<BrandMd> brandMdList) {
+		businessDao.deleteBrandMd(brandMdList.iterator().next().getBrandCd());
+
+		for (BrandMd brandMd : brandMdList) {
+			brandMd.setRegNo(TsaSession.getInfo().getUserNo());
+			brandMd.setUpdNo(TsaSession.getInfo().getUserNo());
+			businessDao.createBrandMd(brandMd);
+		}
+	}
+
+	/**
+	 * 브랜드 노출사이트 목록
+	 * @param brandCd - 브랜드코드
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<SiteBrand> getBrandSiteList(String brandCd) {
+		return businessDao.getBrandSiteList(brandCd);
+	}
+
+	/**
+	 * 브랜드 노출사이트 등록/수정 처리
+	 * @param siteBrandList - 브랜드사이트 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@Transactional("shopTxnManager")
+	public void saveBrandSiteList(Collection<SiteBrand> siteBrandList) {
+		for (SiteBrand siteBrand : siteBrandList) {
+			siteBrand.setRegNo(TsaSession.getInfo().getUserNo());
+			siteBrand.setUpdNo(TsaSession.getInfo().getUserNo());
+//			siteBrand.setTcateCd(businessDao.getTcateCdByBrand(siteBrand));
+			businessDao.saveBrandSite(siteBrand);
+		}
+	}
+
+	/**
+	 * 브랜드 등록/수정
+	 * @param brand - 브랜드 정보
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	@Transactional("shopTxnManager")
+	public void saveBrand(Brand brand) {
+		if (brand.getMode().equals("N")) { // 신규
+			businessDao.createBrand(brand);
+		} else { // 수정
+			businessDao.updateBrand(brand);
+		}
+	}
+
+	/**
+	 * 재고연계관리 - 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public Collection<DeliveryLoc> getStockSyncDeliveryLocList(DeliveryLoc delvLoc) {
+		return businessDao.getStockSyncDeliveryLocList(delvLoc);
+	}
+
+	/**
+	 * 재고연계관리 - 재고연계기준 목록
+	 * @param stockSyncBase - 재고연계기준 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public Collection<StockSyncBase> getStockSyncBaseList(StockSyncBase stockSyncBase) {
+		return businessDao.getStockSyncBaseList(stockSyncBase);
+	}
+
+	/**
+	 * 재고연계관리 - 재고연계기준 저장
+	 * @param stockSyncBase - 재고연계기준 정보
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public void saveStockSyncBaseList(Collection<StockSyncBase> stockSyncBaseList) {
+		for (StockSyncBase stockSyncBase : stockSyncBaseList) {
+			stockSyncBase.setRegNo(TsaSession.getInfo().getUserNo());
+			stockSyncBase.setUpdNo(TsaSession.getInfo().getUserNo());
+			businessDao.saveStockSyncBase(stockSyncBase);
+		}
+	}
+
+	/**
+	 * 판매매장 목록
+	 * @param sellStore - 판매매장 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	public Collection<SellStore> getSellStoreList(SellStore sellStore) {
+		return businessDao.getSellStoreList(sellStore);
+	}
+
+	/**
+	 * 판매매장 목록 저장 처리
+	 * @param sellStoreList - 판매매장 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@Transactional("shopTxnManager")
+	public void saveSellStoreList(Collection<SellStore> sellStoreList) {
+		for (SellStore sellStore : sellStoreList) {
+			sellStore.setRegNo(TsaSession.getInfo().getUserNo());
+			sellStore.setUpdNo(TsaSession.getInfo().getUserNo());
+			businessDao.saveSellStore(sellStore);
+		}
+	}
+
+	/**
+	 * 제휴링크 목록
+	 * @param aflink - 제휴링크 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	public Collection<Aflink> getAflinkList(Aflink aflink) {
+		return businessDao.getAflinkList(aflink);
+	}
+
+	/**
+	 * 제휴링크 등록/수정
+	 * @param aflink - 제휴링크 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@Transactional("shopTxnManager")
+	public void saveAflink(Aflink aflink) {
+		aflink.setRegNo(TsaSession.getInfo().getUserNo());
+		aflink.setUpdNo(TsaSession.getInfo().getUserNo());
+		businessDao.saveAflink(aflink);
+	}
+
+	/**
+	 * 제휴링크 목록 삭제 처리
+	 * @param aflinkList - 제휴링크 목록
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteAflinkList(Collection<Aflink> aflinkList) {
+		for (Aflink aflink : aflinkList) {
+			aflink.setUpdNo(TsaSession.getInfo().getUserNo());
+			businessDao.deleteAflink(aflink);
+		}
+	}
+
+	/**
+	 * 배송업체 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	public Collection<ShipCompany> getShipCompanyList() {
+		return businessDao.getShipCompanyList();
+	}
+
+	/**
+	 * 배송업체 목록 저장
+	 * @param shipCompList - 배송업체 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@Transactional("shopTxnManager")
+	public void saveShipCompanyList(Collection<ShipCompany> shipCompList) {
+		for (ShipCompany shipComp : shipCompList) {
+			shipComp.setRegNo(TsaSession.getInfo().getUserNo());
+			shipComp.setUpdNo(TsaSession.getInfo().getUserNo());
+			businessDao.saveShipCompany(shipComp);
+		}
+	}
+
+	/**
+	 * 배송업체 목록 삭제
+	 * @param shipCompList - 배송업체 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteShipCompanyList(Collection<ShipCompany> shipCompList) {
+		for (ShipCompany shipComp : shipCompList) {
+			shipComp.setUpdNo(TsaSession.getInfo().getUserNo());
+			businessDao.deleteShipCompany(shipComp);
+		}
+	}
+
+}

+ 68 - 68
style24.admin/src/main/java/com/style24/admin/biz/service/TsaClauseService.java

@@ -1,68 +1,68 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.style24.admin.biz.dao.TsaClauseDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.persistence.domain.Clause;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 약관 Service
- *
- * @author gagamel
- * @since 2020. 10. 29
- */
-@Service
-@Slf4j
-public class TsaClauseService {
-
-	@Autowired
-	private TsaClauseDao clauseDao;
-
-	/**
-	 * 약관 목록
-	 * @param clause - 약관 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	public Collection<Clause> getClauseList(Clause clause) {
-		return clauseDao.getClauseList(clause);
-	}
-
-	/**
-	 * 약관 상세
-	 * @param clause - 약관 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	public Clause getClauseDetail(Integer clauseSq) {
-		return clauseDao.getClauseDetail(clauseSq);
-	}
-
-	/**
-	 * 약관 생성/수정
-	 * @param clause - 약관 정보
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@Transactional("shopTxnManager")
-	public void saveClause(Clause clause) {
-		clause.setRegNo(TsaSession.getInfo().getUserNo());
-		clause.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		if (clause.getMode().equals("N")) {
-			clauseDao.createClause(clause);
-		} else {
-			clauseDao.updateClause(clause);
-		}
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaClauseDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.Clause;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 약관 Service
+ *
+ * @author gagamel
+ * @since 2020. 10. 29
+ */
+@Service
+@Slf4j
+public class TsaClauseService {
+
+	@Autowired
+	private TsaClauseDao clauseDao;
+
+	/**
+	 * 약관 목록
+	 * @param clause - 약관 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	public Collection<Clause> getClauseList(Clause clause) {
+		return clauseDao.getClauseList(clause);
+	}
+
+	/**
+	 * 약관 상세
+	 * @param clause - 약관 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	public Clause getClauseDetail(Integer clauseSq) {
+		return clauseDao.getClauseDetail(clauseSq);
+	}
+
+	/**
+	 * 약관 생성/수정
+	 * @param clause - 약관 정보
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@Transactional("shopTxnManager")
+	public void saveClause(Clause clause) {
+		clause.setRegNo(TsaSession.getInfo().getUserNo());
+		clause.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		if (clause.getMode().equals("N")) {
+			clauseDao.createClause(clause);
+		} else {
+			clauseDao.updateClause(clause);
+		}
+	}
+
+}

+ 71 - 71
style24.admin/src/main/java/com/style24/admin/biz/service/TsaCommonService.java

@@ -1,71 +1,71 @@
-package com.style24.admin.biz.service;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.style24.admin.biz.dao.TsaCommonDao;
-import com.style24.persistence.domain.SearchData;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 공용 Service
- *
- * @author eskim
- * @since 2020. 10. 20
- */
-@Service
-@Slf4j
-public class TsaCommonService {
-
-	@Autowired
-	private TsaCommonDao commonDao;
-
-	/**
-	 * 엑셀조회를 위한 SEARCH 테이블 삭제
-	 *
-	 * @param searchData
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	public void deleteExceluploadSearCh(SearchData searchData) {
-		commonDao.deleteExceluploadSearCh(searchData);
-	}
-
-	/**
-	 * 엑셀조회를 위한 SEARCH 테이블 생성
-	 *
-	 * @param searchData
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	public void createExceluploadSearch(SearchData searchData) {
-		commonDao.createExceluploadSearch(searchData);
-	}
-
-	/**
-	 * 엑셀조회를 위한 SEARCH 테이블 생성 - dummy 컬럼 포함
-	 *
-	 * @param searchData
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	public void createExceluploadSearchByAll(SearchData searchData) {
-		commonDao.createExceluploadSearchByAll(searchData);
-	}
-
-	/**
-	 * 샘플파일 시스템파일명 조회
-	 * @param sampleFileId - 샘플파일ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	public String getSampleFileSystemFilename(String sampleFileId) {
-		return commonDao.getSampleFileSystemFilename(sampleFileId);
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.admin.biz.dao.TsaCommonDao;
+import com.style24.persistence.domain.SearchData;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 공용 Service
+ *
+ * @author eskim
+ * @since 2020. 10. 20
+ */
+@Service
+@Slf4j
+public class TsaCommonService {
+
+	@Autowired
+	private TsaCommonDao commonDao;
+
+	/**
+	 * 엑셀조회를 위한 SEARCH 테이블 삭제
+	 *
+	 * @param searchData
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	public void deleteExceluploadSearCh(SearchData searchData) {
+		commonDao.deleteExceluploadSearCh(searchData);
+	}
+
+	/**
+	 * 엑셀조회를 위한 SEARCH 테이블 생성
+	 *
+	 * @param searchData
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	public void createExceluploadSearch(SearchData searchData) {
+		commonDao.createExceluploadSearch(searchData);
+	}
+
+	/**
+	 * 엑셀조회를 위한 SEARCH 테이블 생성 - dummy 컬럼 포함
+	 *
+	 * @param searchData
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	public void createExceluploadSearchByAll(SearchData searchData) {
+		commonDao.createExceluploadSearchByAll(searchData);
+	}
+
+	/**
+	 * 샘플파일 시스템파일명 조회
+	 * @param sampleFileId - 샘플파일ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	public String getSampleFileSystemFilename(String sampleFileId) {
+		return commonDao.getSampleFileSystemFilename(sampleFileId);
+	}
+
+}

+ 74 - 74
style24.admin/src/main/java/com/style24/admin/biz/service/TsaEnvsetService.java

@@ -1,74 +1,74 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.style24.admin.biz.dao.TsaEnvsetDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.biz.dao.TscEnvsetDao;
-import com.style24.persistence.domain.Envset;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 환경설정 Service
- *
- * @author gagamel
- * @since 2020. 10. 21
- */
-@Service
-@Slf4j
-public class TsaEnvsetService {
-
-	@Autowired
-	private TscEnvsetDao cenvsetDao;
-
-	@Autowired
-	private TsaEnvsetDao envsetDao;
-
-	/**
-	 * 환경설정정보 저장
-	 * 		정책은 중요한 정보로서 캐싱 문제 발생 시 심각해질 수 있으므로 캐싱처리 안 함
-	 * @param envset - 환경설정 정보
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	@Transactional("shopTxnManager")
-	public void createEnvset(Envset envset) {
-		envset.setRegNo(TsaSession.getInfo().getUserNo());
-		envsetDao.createEnvset(envset);
-	}
-
-	/**
-	 * 환경설정정보 - 메타정보 저장. 수정 시 캐싱 삭제
-	 * @param envset - 환경설정 정보
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	@Transactional("shopTxnManager")
-	@CacheEvict(value = "metainfo", allEntries = true)
-	public void createEnvsetMetaInfo(Envset envset) {
-		envset.setRegNo(TsaSession.getInfo().getUserNo());
-		envsetDao.createEnvset(envset);
-	}
-
-	/**
-	 * 환경설정이력 목록
-	 * @param siteCd - 사이트코드
-	 * @param envsetType - 환경설정유형
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	public Collection<Envset> getEnvsetHistoryList(String siteCd, String envsetType) {
-		Envset envset = new Envset();
-		envset.setSiteCd(siteCd);
-		envset.setEnvsetType(envsetType);
-		return envsetDao.getEnvsetList(envset);
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaEnvsetDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.dao.TscEnvsetDao;
+import com.style24.persistence.domain.Envset;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 환경설정 Service
+ *
+ * @author gagamel
+ * @since 2020. 10. 21
+ */
+@Service
+@Slf4j
+public class TsaEnvsetService {
+
+	@Autowired
+	private TscEnvsetDao cenvsetDao;
+
+	@Autowired
+	private TsaEnvsetDao envsetDao;
+
+	/**
+	 * 환경설정정보 저장
+	 * 		정책은 중요한 정보로서 캐싱 문제 발생 시 심각해질 수 있으므로 캐싱처리 안 함
+	 * @param envset - 환경설정 정보
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	@Transactional("shopTxnManager")
+	public void createEnvset(Envset envset) {
+		envset.setRegNo(TsaSession.getInfo().getUserNo());
+		envsetDao.createEnvset(envset);
+	}
+
+	/**
+	 * 환경설정정보 - 메타정보 저장. 수정 시 캐싱 삭제
+	 * @param envset - 환경설정 정보
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	@Transactional("shopTxnManager")
+	@CacheEvict(value = "metainfo", allEntries = true)
+	public void createEnvsetMetaInfo(Envset envset) {
+		envset.setRegNo(TsaSession.getInfo().getUserNo());
+		envsetDao.createEnvset(envset);
+	}
+
+	/**
+	 * 환경설정이력 목록
+	 * @param siteCd - 사이트코드
+	 * @param envsetType - 환경설정유형
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	public Collection<Envset> getEnvsetHistoryList(String siteCd, String envsetType) {
+		Envset envset = new Envset();
+		envset.setSiteCd(siteCd);
+		envset.setEnvsetType(envsetType);
+		return envsetDao.getEnvsetList(envset);
+	}
+
+}

+ 66 - 66
style24.admin/src/main/java/com/style24/admin/biz/service/TsaFaqService.java

@@ -1,66 +1,66 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.style24.admin.biz.dao.TsaFaqDao;
-import com.style24.persistence.domain.Faq;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * FAQ Service
- *
- * @author gagamel
- * @since 2020. 11. 3
- */
-@Service
-@Slf4j
-public class TsaFaqService {
-
-	@Autowired
-	private TsaFaqDao faqDao;
-
-	/**
-	 * FAQ 목록
-	 * @param faq - FAQ 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	public Collection<Faq> getFaqList(Faq faq) {
-		return faqDao.getFaqList(faq);
-	}
-
-	/**
-	 * FAQ 등록/수정
-	 * @param faq - FAQ 정보
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@Transactional("shopTxnManager")
-	public void saveFaq(Faq faq) {
-		// 내용 유무 확인
-		if (StringUtils.isNotBlank(faq.getAnswer())) {
-			faq.setAnswer(faq.getAnswer().replaceAll("&lt;", "<").replaceAll("&gt;", ">"));
-		}
-
-		faqDao.saveFaq(faq);
-	}
-
-	/**
-	 * FAQ 상세
-	 * @param faqSq - FAQ일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	public Faq getFaq(Integer faqSq) {
-		return faqDao.getFaq(faqSq);
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaFaqDao;
+import com.style24.persistence.domain.Faq;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * FAQ Service
+ *
+ * @author gagamel
+ * @since 2020. 11. 3
+ */
+@Service
+@Slf4j
+public class TsaFaqService {
+
+	@Autowired
+	private TsaFaqDao faqDao;
+
+	/**
+	 * FAQ 목록
+	 * @param faq - FAQ 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	public Collection<Faq> getFaqList(Faq faq) {
+		return faqDao.getFaqList(faq);
+	}
+
+	/**
+	 * FAQ 등록/수정
+	 * @param faq - FAQ 정보
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@Transactional("shopTxnManager")
+	public void saveFaq(Faq faq) {
+		// 내용 유무 확인
+		if (StringUtils.isNotBlank(faq.getAnswer())) {
+			faq.setAnswer(faq.getAnswer().replaceAll("&lt;", "<").replaceAll("&gt;", ">"));
+		}
+
+		faqDao.saveFaq(faq);
+	}
+
+	/**
+	 * FAQ 상세
+	 * @param faqSq - FAQ일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	public Faq getFaq(Integer faqSq) {
+		return faqDao.getFaq(faqSq);
+	}
+
+}

+ 1608 - 1608
style24.admin/src/main/java/com/style24/admin/biz/service/TsaGoodsService.java

@@ -1,1608 +1,1608 @@
-package com.style24.admin.biz.service;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.StringUtils;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.style24.admin.biz.dao.TsaGoodsDao;
-import com.style24.admin.support.env.TsaConstants;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Brand;
-import com.style24.persistence.domain.Color;
-import com.style24.persistence.domain.Goods;
-import com.style24.persistence.domain.GoodsCompose;
-import com.style24.persistence.domain.GoodsDesc;
-import com.style24.persistence.domain.GoodsEpSkip;
-import com.style24.persistence.domain.GoodsHst;
-import com.style24.persistence.domain.GoodsNotiInfo;
-import com.style24.persistence.domain.GoodsSearch;
-import com.style24.persistence.domain.GoodsTnmRes;
-import com.style24.persistence.domain.Itemkind;
-import com.style24.persistence.domain.NotiInfo;
-import com.style24.persistence.domain.Notice;
-import com.style24.persistence.domain.NoticeGoods;
-import com.style24.persistence.domain.Option;
-import com.style24.persistence.domain.SearchData;
-
-import lombok.extern.slf4j.Slf4j;
-
-import com.gagaframework.excel.GagaExcelUtil;
-import com.gagaframework.excel.env.GagaExcelConstants;
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.util.GagaDateUtil;
-import com.gagaframework.web.util.GagaFileUtil;
-import com.gagaframework.web.util.GagaStringUtil;
-
-/**
- *상품관리 Service
- *
- * @author eskim
- * @since 2020. 10. 16
- */
-@Service
-@Slf4j
-public class TsaGoodsService {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private Environment env;
-
-	@Autowired
-	private TsaGoodsDao goodsDao;
-
-	@Autowired
-	private TsaBusinessService businessService;
-
-	@Autowired
-	private TsaCommonService commonService;
-
-	@Autowired
-	private TsaRendererService rendererService;
-
-	@Autowired
-	private TsaNoticeService noticeService;
-
-
-
-	@Autowired
-	private ObjectMapper mapper;
-
-	private static final String NUMBER_PATTERN = "^[0-9]+$";
-
-	private static final String SELF_GOOODS_AFTER = "STY";
-
-	/**
-	 * 상품 할인율 계산
-	 *
-	 * @param value
-	 * @param len
-	 * @param pad
-	 * @return
-	 */
-	private long getDcRate(int listPrice, int currPrice) {
-		double rate = (double)(currPrice) / (double)(listPrice);
-		return 100 - (long)((Math.round(rate * 100) / 100.0) * 100);
-	}
-
-	/**
-	 * 품목 목록
-	 * @param itemkind
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	public Collection<Itemkind> getItemkindList(Itemkind itemkind) {
-		return goodsDao.getItemkindList(itemkind);
-	}
-
-	/**
-	 * 품목 저장
-	 *
-	 * @param itemkindList - 품목 정보 목록
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@Transactional("shopTxnManager")
-	public void saveItemkindInfo(Collection<Itemkind> itemkindList) {
-		for (Itemkind itemkind : itemkindList) {
-			itemkind.setRegNo(TsaSession.getInfo().getUserNo());
-			itemkind.setUpdNo(TsaSession.getInfo().getUserNo());
-			itemkind.setItemkindNm(GagaStringUtil.replace(GagaStringUtil.replace(itemkind.getItemkindNm(), "&lt;", "<"),"&gt;", ">"));
-			//itemkind.setItemkindEnm(GagaStringUtil.replace(GagaStringUtil.replace(itemkind.getItemkindEnm(), "&lt;", "<"),"&gt;", ">"));
-			goodsDao.saveItemkindInfo(itemkind);
-		}
-	}
-
-	/**
-	 * 품목 삭제
-	 *
-	 * @param itemkindList - 품목 정보 목록
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteItemkindInfo(Collection<Itemkind> itemkindList) {
-		for (Itemkind itemkind : itemkindList) {
-			goodsDao.deleteItemkindInfo(itemkind);
-		}
-	}
-
-	/**
-	 * 색상목록 조회
-	 *
-	 * @param color
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	public Collection<Color> getColorList(Color color) {
-		return goodsDao.getColorList(color);
-	}
-
-	/**
-	 * 색상 저장
-	 *
-	 * @param colorList
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@Transactional("shopTxnManager")
-	public void saveColor(Collection<Color> colorList) {
-
-		for (Color color : colorList) {
-
-			color.setRegNo(TsaSession.getInfo().getUserNo());
-			color.setUpdNo(TsaSession.getInfo().getUserNo());
-
-			goodsDao.saveColor(color);
-		}
-	}
-
-	/**
-	 * 상품정보고시 목록
-	 *
-	 * @param notiInfo
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 19
-	 */
-	public Collection<NotiInfo> getNotiInfoList(NotiInfo notiInfo) {
-		return goodsDao.getNotiInfoList(notiInfo);
-	}
-
-	/**
-	 * 상품정보고시 항목 목록
-	 *
-	 * @param notiInfo
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 19
-	 */
-	public Collection<NotiInfo> getNotiInfoItemList(NotiInfo notiInfo) {
-		return goodsDao.getNotiInfoItemList(notiInfo);
-	}
-
-	/**
-	 * 상품정보고시 항목 저장
-	 *
-	 * @param notiInfoList
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 19
-	 */
-	@Transactional("shopTxnManager")
-	public void saveNotiInfoItem(Collection<NotiInfo> notiInfoList) {
-		if (notiInfoList == null || notiInfoList.isEmpty())
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-
-		for (NotiInfo notiInfo : notiInfoList) {
-			if (!StringUtils.isEmpty(notiInfo.getNiContent())) {
-				notiInfo.setNiContent(GagaStringUtil.replace(GagaStringUtil.replace(notiInfo.getNiContent(),"&lt;", "<"),"&gt;", ">"));
-			}
-			notiInfo.setRegNo(TsaSession.getInfo().getUserNo());
-			notiInfo.setUpdNo(TsaSession.getInfo().getUserNo());
-			goodsDao.saveNotiInfo(notiInfo);
-		}
-	}
-
-	/**
-	 * 상품 목록 건수
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 20
-	 */
-	public int getGoodsListCount(GoodsSearch goodsSearch) {
-		return goodsDao.getGoodsListCount(goodsSearch);
-	}
-
-	/**
-	 * 상품 목록
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 20
-	 */
-	public Collection<Goods> getGoodsList(GoodsSearch goodsSearch) {
-		return goodsDao.getGoodsList(goodsSearch);
-	}
-
-	/**
-	 * 상품목록 - 기본정보 엑셀다운로드
-	 *
-	 * @param goodsSearch
-	 * @param excelFilenameWithPath - 경로를 포함한 엑셀파일명
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 21
-	 */
-	public void getGoodsInfoExcelList(GoodsSearch goodsSearch, String excelFilenameWithPath) {
-
-		if ("Y".equals(goodsSearch.getImageViewYn())) {
-			// 헤더 title 설정
-			String[] listTitles = {"이미지", "상품코드", "업체명", "브랜드명", "상품명", "품목", "재고", "상품상태", "스타일년도", "시즌",
-				"정상가", "판매가", "할인율", "가격변경일", "ERP재고연동여부", "정상이월구분", "반품가능 여부","승인일시"};
-
-			// DB 처리 시 사용되는 파라미터명(셀명) 설정
-			String[] cellNames = {"IMG_PATH1", "GOODS_CD", "SUPPLY_COMP_CD", "BRAND_GRP_NM", "GOODS_NM", "ITEMKIND_NM",
-				"STOCK_QTY_SUM", "GOODS_STAT", "STYLE_YEAR", "SEASON_CD",  "LIST_PRICE", "CURR_PRICE",
-				"DC_RATE", "PRICE_UPD_DT", "ERP_STOCK_LINK_YN", "FORMAL_GB", "RETURNABLE_YN", "FRST_CFRM_DT"};
-
-			String[] cellTypes = {GagaExcelConstants.CellType.IMAGE.name(),
-				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
-				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
-				GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
-				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-				GagaExcelConstants.CellType.CHAR_CENTER.name(),
-				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name()};
-
-			String targetPath = env.getProperty("upload.goods.view");
-			Collection<GagaMap> dataList = goodsDao.getGoodsInfoExcelList(goodsSearch); // map형식으로 조회
-			if (dataList != null && !dataList.isEmpty()) {
-				for (GagaMap gagaMap : dataList) {
-					if ("A".equals(gagaMap.get("IMG_TYPE").toString())) {
-						gagaMap.set("IMG_PATH1", gagaMap.get("IMG_PATH1").toString());
-					} else {
-
-						if (!StringUtils.isEmpty(gagaMap.get("IMG_PATH6"))) {
-							gagaMap.set("IMG_PATH1", targetPath + gagaMap.get("IMG_PATH6").toString());
-
-						} else {
-							gagaMap.set("IMG_PATH1", targetPath + gagaMap.get("IMG_PATH1").toString());
-						}
-					}
-				}
-			}
-
-			try {
-				GagaExcelUtil.createExcel(excelFilenameWithPath, dataList, "상품 정보", listTitles, cellNames, cellTypes, TsaConstants.EXCEL_FOOTER_TITLE);
-			} catch (Exception e) {
-				throw new IllegalStateException(e);
-			}
-
-		} else {
-			// 헤더 title 설정
-			String[] listTitles = {"상품코드", "업체명", "브랜드명", "상품명", "품목", "재고", "상품상태", "스타일년도",
-				"시즌",  "정상가", "판매가", "할인율", "가격변경일", "ERP재고연동여부", "정상이월구분", "반품가능 여부", "승인일시"};
-
-			// DB 처리 시 사용되는 파라미터명(셀명) 설정
-			String[] cellNames = {"GOODS_CD", "SUPPLY_COMP_CD", "BRAND_GRP_NM", "GOODS_NM", "ITEMKIND_NM", "STOCK_QTY_SUM", "GOODS_STAT", "STYLE_YEAR",
-				"SEASON_CD",  "LIST_PRICE", "CURR_PRICE", "DC_RATE", "PRICE_UPD_DT", "ERP_STOCK_LINK_YN", "FORMAL_GB", "RETURNABLE_YN", "FRST_CFRM_DT"};
-
-			String[] cellTypes = {
-			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
-			GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
-			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name()};
-
-			Collection<GagaMap> dataList = goodsDao.getGoodsInfoExcelList(goodsSearch);
-
-			try {
-				GagaExcelUtil.createExcel(excelFilenameWithPath, dataList, "상품 정보", listTitles, cellNames, cellTypes, TsaConstants.EXCEL_FOOTER_TITLE);
-			} catch (Exception e) {
-				throw new IllegalStateException(e);
-			}
-		}
-	}
-
-	/**
-	 * 상품 이미지 등록여부 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 21
-	 */
-	public Collection<Goods> getGoodsImgsYn(Goods goods) {
-		return goodsDao.getGoodsImgsYn(goods);
-	}
-
-	/**
-	 * 상품 상세
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	public Goods getGoods(Goods goods) {
-		// 상품기본정보
-		Goods resultGoods = goodsDao.getGoods(goods);
-
-		// 상품 상세
-		this.getGoodsDesc(resultGoods);
-		return resultGoods;
-	}
-
-	/**
-	 * 상품 상세 조회
-	 *
-	 * @param resultGoods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	private Goods getGoodsDesc(Goods resultGoods) {
-
-		GoodsDesc goods = new GoodsDesc();
-		goods.setGoodsCd(resultGoods.getGoodsCd());
-
-		//		goods.setDescGb("10");
-		//		String goodsDesc = this.getGoodsDescList(goods);
-		//		resultGoods.setGoodsDesc(goodsDesc);
-
-		// 상품 상세 pc 상단
-		goods.setDescGb("20");
-		String goodsPcTopDesc = this.getGoodsDescList(goods);
-		resultGoods.setGoodsPcTopDesc(goodsPcTopDesc);
-
-		// 상품 상세  pc 하단
-		goods.setDescGb("30");
-		String goodsPcDownDesc = this.getGoodsDescList(goods);
-		resultGoods.setGoodsPcDownDesc(goodsPcDownDesc);
-
-		// 상품 상세 mobile 상단
-		goods.setDescGb("40");
-		String goodsMobileTopDesc = this.getGoodsDescList(goods);
-		resultGoods.setGoodsMobileTopDesc(goodsMobileTopDesc);
-
-		// 상품 상세 mpbile 하단
-		goods.setDescGb("50");
-		String goodsMobileDownDesc = this.getGoodsDescList(goods);
-		resultGoods.setGoodsMobileDownDesc(goodsMobileDownDesc);
-
-		return resultGoods;
-	}
-
-	/**
-	 * 상품 상세구분별 컨텐츠 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	private String getGoodsDescList(GoodsDesc goodsDesc) {
-		Collection<GoodsDesc> goodsDescList = goodsDao.getGoodsDescList(goodsDesc);
-		StringBuilder goodsDescSb = new StringBuilder();
-		if (goodsDescList != null && !goodsDescList.isEmpty()) {
-			for (GoodsDesc tmpGoodsDesc : goodsDescList) {
-				goodsDescSb.append(tmpGoodsDesc.getGoodsDesc());
-			}
-		}
-		return goodsDescSb.toString();
-	}
-
-	/**
-	 * 상품 정보 이력 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2019. 12. 12
-	 */
-	public Collection<GoodsHst> getGoodsHstList(Goods goods) {
-		return goodsDao.getGoodsHstList(goods);
-	}
-
-	/**
-	 * 상품 옵션 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 26
-	 */
-	public Collection<Option> getGoodsSizeList(Goods goods) {
-		return goodsDao.getGoodsSizeList(goods);
-	}
-
-	/**
-	 * 상품 정보고시 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	public Collection<GoodsNotiInfo> getGoodsNotiInfoList(GoodsNotiInfo goodsNotiInfo) {
-		return goodsDao.getGoodsNotiInfoList(goodsNotiInfo);
-	}
-
-	/**
-	 * 구성상품 목록
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	public Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods) {
-		return goodsDao.getGoodsDetailComposeList(goods);
-	}
-
-	/**
-	 * 같은 품번 상품목록
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	public Collection<Goods> getGoodsNumGoodsList(Goods goods) {
-		return goodsDao.getGoodsNumGoodsList(goods);
-	}
-
-
-	/**
-	 * 상품 수정 항목 일괄변경
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 01. 17
-	 */
-	@Transactional("shopTxnManager")
-	public void updateGoodsState(Goods goods) {
-		if (goods == null || (goods.getArrGoodsCd() == null && goods.getArrGoodsCd().length <= 0)) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		goods.setRegNo(TsaSession.getInfo().getUserNo());
-		goods.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		if (goods.getArrGoodsCd().length > 0) {
-			for (String goodsCd : goods.getArrGoodsCd()) {
-
-				goods.setGoodsCd(goodsCd);
-				// 이력생성
-				goodsDao.createGoodsHst(goods);
-
-				if ("formalGb".equals(goods.getProcJob())) {
-					// 상품브랜드 조회
-					Goods originGoods = goodsDao.getGoods(goods);
-					// 브랜드 확인
-					goods.setPntPrate(originGoods.getPntPrate()); // 포인트적립율(PC)
-					goods.setPntMrate(originGoods.getPntMrate()); // 포인트적립율(MOBILE)
-					Brand brand = new Brand();
-					brand.setBrandCd(originGoods.getBrandCd());
-					Collection<Brand> brandList = businessService.getBrandList(brand);
-					if (brandList != null && !brandList.isEmpty()) {
-						float pntPrate = 0;
-						float pntMrate = 0;
-						for (Brand tmpBrand : brandList) {
-							if ("G009_10".equals(goods.getFormalGb())) {
-								pntPrate = tmpBrand.getPntPrate10();
-								pntMrate = tmpBrand.getPntMrate10();
-							} else {
-								pntPrate = tmpBrand.getPntPrate20();
-								pntMrate = tmpBrand.getPntMrate20();
-							}
-						}
-						goods.setPntPrate(pntPrate); // 포인트적립율(PC)
-						goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
-					}
-				} else if ("goodsStat".equals(goods.getProcJob())) {
-					// 상품브랜드 조회
-					Goods originGoods = goodsDao.getGoods(goods);
-
-					// 승인일
-					if (!goods.getGoodsStat().equals(originGoods.getGoodsStat()) && "G008_90".equals(goods.getGoodsStat())) {
-						goods.setChGoodsStatYn("Y");
-					}
-				}
-				// 상품정보 변경
-				goodsDao.updateGoodsState(goods);
-			}
-
-		} else {
-
-			// 이력생성
-			goodsDao.createGoodsHst(goods);
-			if ("formalGb".equals(goods.getProcJob())) {
-				// 상품브랜드 조회
-				Goods originGoods = goodsDao.getGoods(goods);
-				// 브랜드 확인
-				goods.setPntPrate(originGoods.getPntPrate()); // 포인트적립율(PC)
-				goods.setPntMrate(originGoods.getPntMrate()); // 포인트적립율(MOBILE)
-				Brand brand = new Brand();
-				brand.setBrandCd(originGoods.getBrandCd());
-				Collection<Brand> brandList = businessService.getBrandList(brand);
-				if (brandList != null && !brandList.isEmpty()) {
-					float pntPrate = 0;
-					float pntMrate = 0;
-					for (Brand tmpBrand : brandList) {
-						if ("G009_10".equals(goods.getFormalGb())) {
-							pntPrate = tmpBrand.getPntPrate10();
-							pntMrate = tmpBrand.getPntMrate10();
-						} else {
-							pntPrate = tmpBrand.getPntPrate20();
-							pntMrate = tmpBrand.getPntMrate20();
-						}
-					}
-					goods.setPntPrate(pntPrate); // 포인트적립율(PC)
-					goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
-				}
-			}
-			// 상품정보 변경
-			goodsDao.updateGoodsState(goods);
-		}
-	}
-
-	/**
-	 * 엑셀조회용 상품 저장
-	 *
-	 * @param procJob : goodsExcelUpload
-	 * @param goodsList
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	@Transactional("shopTxnManager")
-	public void saveExceluploadGoods(Collection<Goods> goodsList, String excelFilename) {
-
-		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
-		if (goodsList == null || goodsList.isEmpty()) {
-			this.deleteExceluploadFile(targetPath, excelFilename);
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		int index = 0;
-		String goodsCdFlag = "";
-		String goodsNumFlag = "";
-		for (Goods goods : goodsList) {
-
-			if (!StringUtils.isEmpty(goodsCdFlag) && !StringUtils.isEmpty(goodsNumFlag)) {
-				throw new IllegalStateException("상품코드와 원코드 중 한 개의 셀에만 값을 입력해서 조회하세요.");
-			}
-
-			if (!StringUtils.isEmpty(goods.getSupplyCompCd())) {
-				goods.setGoodsCd(goods.getSupplyCompCd());
-			}
-
-			SearchData searchData = new SearchData();
-			searchData.setRegNo(goods.getRegNo());
-			searchData.setSearchCd(goods.getGoodsCd());
-			if (index == 0) {
-				commonService.deleteExceluploadSearCh(searchData);
-			}
-
-			commonService.createExceluploadSearch(searchData);
-			index++;
-		}
-	}
-
-	/**
-	 * 파일 삭제
-	 *
-	 * @param targetPath
-	 * @param excelFilename
-	 * @author eskim
-	 * @since 2020. 10. 22
-	 */
-	private void deleteExceluploadFile(String targetPath, String excelFilename) {
-		// 파일 삭제
-		try {
-			GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, excelFilename));
-		} catch (IOException e) {
-			// Nothing Do
-		}
-	}
-
-	/**
-	 * 상품 품목 변경 저장
-	 *
-	 * @param goodsList
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	@Transactional("shopTxnManager")
-	//@CacheEvict(value = "cate", allEntries = true)
-	public void saveItemKindChange(Collection<Goods> goodsList) {
-		for (Goods goods : goodsList) {
-			goods.setRegNo(TsaSession.getInfo().getUserNo());
-			goods.setUpdNo(TsaSession.getInfo().getUserNo());
-			goods.setItemkindCd(goods.getItemkindCd().toUpperCase());
-			// 품목확인
-			Itemkind itemkind = new Itemkind();
-			itemkind.setItemkindCd(goods.getItemkindCd());
-			itemkind.setUseYn("Y");
-			Collection<Itemkind> itemkindList = goodsDao.getItemkindList(itemkind);
-			if (itemkindList == null || itemkindList.isEmpty()) {
-				throw new IllegalStateException(goods.getGoodsCd() + " 상품의 품목코드를 확인해주세요.");
-			}
-
-			// 상품이력
-			goodsDao.createGoodsHst(goods);
-			// 품목변경
-			goodsDao.updateGoodItemKindCd(goods);
-
-			// 검색어 변경
-			String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
-			Goods tmpGoods = goodsDao.getGoods(goods);
-			if (tmpGoods != null && !StringUtils.isEmpty(tmpGoods.getGoodsSnm1())) {
-				String[] arrGoodsSnm = tmpGoods.getGoodsSnm1().split(";");
-				StringBuilder tempGoodsSnm = new StringBuilder();
-				for (String loopGoodsSnm : arrGoodsSnm) {
-					if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
-						tempGoodsSnm.append(loopGoodsSnm).append(";");
-					}
-				}
-				goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
-
-			} else {
-				goods.setGoodsSnm(goodsSnm);
-			}
-			goodsDao.updateGoodsSnm(goods);
-
-			Collection<GoodsNotiInfo> goodsNotiInfoList = goodsDao.getNewNotiInfo(goods);
-			goodsDao.deleteGoodsNotiInfo(goods);
-
-			for (GoodsNotiInfo goodsNotiInfo : goodsNotiInfoList) {
-				goodsNotiInfo.setRegNo(TsaSession.getInfo().getUserNo());
-				goodsNotiInfo.setUpdNo(TsaSession.getInfo().getUserNo());
-				goodsNotiInfo.setGoodsCd(goods.getGoodsCd());
-				goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
-			}
-
-			this.saveGoodsCategory(goods);
-		}
-	}
-
-	/**
-	 * 상품 품목 기준 카테고리 저장
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 4. 21.
-	 */
-	private void saveGoodsCategory(Goods goods) {
-
-//		GoodsCategory goodsCategory = new GoodsCategory();
-//		goodsCategory.setRegNo(TsaSession.getInfo().getUserNo());
-//		goodsCategory.setUpdNo(TsaSession.getInfo().getUserNo());
-//		goodsCategory.setGoodsCd(goods.getGoodsCd());
-//		displayService.deleteGoodsCategory(goodsCategory);
-//
-//		Collection<ItemkindCategory> itemkindCategoryList = displayService.getItemkindCategoryList(goods.getItemkindCd());
-//		for ItemkindCategory itemkindCategory : itemkindCategoryList) {
-//			Category category = new Category();
-//			category.setCateGb(itemkindCategory.getCateGb());
-//			category.setCateCd(itemkindCategory.getCateCd());
-//			category = displayService.getCategory4srch(category);
-//
-//			CategoryGoods categoryGoods = new CategoryGoods();
-//			categoryGoods.setRegNo(TsaSession.getInfo().getUserNo());
-//			categoryGoods.setUpdNo(TsaSession.getInfo().getUserNo());
-//			String[] goodsCdArr = {goods.getGoodsCd()};
-//			categoryGoods.setGoodsCdArr(goodsCdArr);
-//			if (category.getCateGb() != null) {
-//				categoryGoods.setNcateGb(String.valueOf(category.getCateGb()));
-//			}
-//			if (category.getCateType() != null) {
-//				categoryGoods.setNcateType(String.valueOf(category.getCateType()));
-//			}
-//			if (category.getCateCd() != null) {
-//				categoryGoods.setNcateCd(String.valueOf(category.getCateCd()));
-//			}
-//			if (category.getTcateCd() != null) {
-//				categoryGoods.setNtcateCd(String.valueOf(category.getTcateCd()));
-//			}
-//			if (category.getMcateCd() != null) {
-//				categoryGoods.setNmcateCd(String.valueOf(category.getMcateCd()));
-//			}
-//			if (category.getScateCd() != null) {
-//				categoryGoods.setNscateCd(String.valueOf(category.getScateCd()));
-//			}
-//			if (category.getDcateCd() != null) {
-//				categoryGoods.setNdcateCd(String.valueOf(category.getDcateCd()));
-//			}
-//			displayService.moveCategoryGoods(categoryGoods);
-//		}
-	}
-
-	/**
-	 * 상품 저장
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	@Transactional("shopTxnManager")
-	public void saveGoodsDetail(Goods goods) {
-
-		// <,> replace 처리
-		goods.setRegNo(TsaSession.getInfo().getUserNo());
-		goods.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		goods.setGoodsPcTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcTopDesc(), "&lt;", "<"), "&gt;", ">"));
-		goods.setGoodsMobileTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileTopDesc(), "&lt;", "<"), "&gt;", ">"));
-		goods.setGoodsPcDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcDownDesc(), "&lt;", "<"), "&gt;", ">"));
-		goods.setGoodsMobileDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileDownDesc(), "&lt;", "<"), "&gt;", ">"));
-
-		goods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
-		goods.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
-		goods.setGoodsSnm1(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsSnm1(), "&lt;", "<"), "&gt;", ">"));
-
-		// 세트일 경우 상품 가격 확인
-		if ("G056_S".equals(goods.getGoodsType())) {
-
-			Collection<GoodsCompose> goodsExtendList = goods.getGoodsComposeListNew();
-			int currPriceSum = 0;
-			for (GoodsCompose regGoodsExtend : goodsExtendList) {
-				currPriceSum  = currPriceSum + regGoodsExtend.getCompsCurrPrice();
-			}
-
-			if (currPriceSum != goods.getCurrPriceOrg()) {
-				goods.setCurrBprice(goods.getCurrPriceOrg());
-				goods.setCurrPrice(currPriceSum);
-				goods.setDcRate((int)(this.getDcRate(goods.getListPrice() , currPriceSum)));
-			}
-		}else {
-			// 가격변경일
-			if (goods.getCurrPrice() != goods.getCurrPriceOrg()) {
-				goods.setCurrBprice(goods.getCurrPriceOrg());
-			} else {
-				goods.setCurrPrice(goods.getCurrPriceOrg());
-			}
-		}
-
-		// 승인일
-		if (!goods.getGoodsStat().equals(goods.getGoodsStatOrg()) && "G008_90".equals(goods.getGoodsStat())) {
-			goods.setChGoodsStatYn("Y");
-		}
-		// 사용자 검색어를 검색어에 적용
-		String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
-		if (!StringUtils.isEmpty(goods.getGoodsSnm1())) {
-			goods.setGoodsSnm1(GagaStringUtil.replace(goods.getGoodsSnm1(), " ", "")); // 빈값 삭제
-			String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
-			StringBuilder tempGoodsSnm = new StringBuilder();
-			for (String loopGoodsSnm : arrGoodsSnm) {
-				if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
-					tempGoodsSnm.append(loopGoodsSnm).append(";");
-				}
-			}
-			goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
-
-		} else if (!goodsSnm.equals(goods.getGoodsSnm())) {
-			goods.setGoodsSnm(goodsSnm);
-		}
-
-		goods.setFormalGb(goods.getFormalGb());
-		// 브랜드 확인
-		if (!"G056_N".equals(goods.getGoodsType())) {
-			if (!goods.getFormalGb().equals(goods.getFormalGbOrg())) {
-				Brand brand = new Brand();
-				brand.setBrandCd(goods.getBrandCd());
-				Collection<Brand> brandList = businessService.getBrandList(brand);
-				if (brandList != null && !brandList.isEmpty()) {
-					float pntPrate = 0.0f;
-					float pntMrate = 0.0f;
-					for (Brand tmpBrand : brandList) {
-						if ("G009_10".equals(goods.getFormalGb())) {
-							pntPrate = tmpBrand.getPntPrate10();
-							pntMrate = tmpBrand.getPntMrate10();
-						} else {
-							pntPrate = tmpBrand.getPntPrate20();
-							pntMrate = tmpBrand.getPntMrate20();
-						}
-					}
-					goods.setPntPrate(pntPrate); // 포인트적립율(PC)
-					goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
-				}
-			}
-		}
-
-		// 기본정보 변경
-		if ("Y".equals(goods.getChDataYn())) {
-			goodsDao.createGoodsHst(goods);
-			goodsDao.updateGoods(goods);
-		}
-
-		// 상품상세정보 변경
-		if (!"Y".equals(goods.getChkDescKeep())) {
-			this.saveGoodsDetailDesc(goods);
-		}
-
-		int idx = 1;
-		// 구성상품 변경
-		if (!"G056_N".equals(goods.getGoodsType())) {
-
-			Collection<GoodsCompose> goodsExtendList = goods.getGoodsComposeListNew();
-			for (GoodsCompose regGoodsExtend : goodsExtendList) {
-				regGoodsExtend.setDispOrd(idx);
-				regGoodsExtend.setRegNo(TsaSession.getInfo().getUserNo());
-				regGoodsExtend.setUpdNo(TsaSession.getInfo().getUserNo());
-				goodsDao.saveGoodsCompose(regGoodsExtend); // 구성상품기본 저장
-
-				idx++;
-			}
-		}
-
-		// 옵션/재고 변경
-		if (goods.getOptCd() != null && goods.getOptCd().length > 0 && "Y".equals(goods.getChStockDataYn())) {
-			this.saveStock(goods);
-		}
-
-		// 상품 정보고시 변경
-		this.saveGoodsNotiInfo(goods);
-
-	}
-
-	/**
-	 * 상품상세정보 변경 - 상품상세
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 27.
-	 */
-	private void saveGoodsDetailDesc(Goods goods) {
-		// 상품상세 구분(10:상품설명, 20:상위컨텐츠, 30:하위컨텐츠, 40:하위컨텐츠-모바일, 50:상위컨텐츠-모바일)
-		GoodsDesc goodsDesc = new GoodsDesc();
-		goodsDesc.setGoodsCd(goods.getGoodsCd());
-		goodsDesc.setRegNo(goods.getRegNo());
-		goodsDesc.setUpdNo(goods.getUpdNo());
-
-		// PC 상단
-		goodsDesc.setDescGb("10");
-		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
-		this.saveGoodsDesc(goodsDesc);
-
-		// PC 하단
-		goodsDesc.setDescGb("20");
-		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
-		this.saveGoodsDesc(goodsDesc);
-
-		// 공용 하단
-		goodsDesc.setDescGb("30");
-		goodsDesc.setGoodsDesc(goods.getGoodsPcDownDesc());
-		this.saveGoodsDesc(goodsDesc);
-
-		// MO 상단
-		goodsDesc.setDescGb("40");
-		goodsDesc.setGoodsDesc(goods.getGoodsMobileTopDesc());
-		this.saveGoodsDesc(goodsDesc);
-
-		//		// 상품상세 저장
-
-		//
-		//		// 세트상품의 구서상품으로 있을경우 처리
-		//		this.saveGoodsSetDesc(goodsDesc);
-
-		// MO 하단
-		goodsDesc.setDescGb("50");
-		goodsDesc.setGoodsDesc(goods.getGoodsMobileDownDesc());
-		this.saveGoodsDesc(goodsDesc);
-	}
-
-	/**
-	 * 상품 상세 저장
-	 *
-	 * @param goodsDesc
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	private void saveGoodsDesc(GoodsDesc goodsDesc) {
-
-		goodsDao.deleteGoodsDesc(goodsDesc);
-
-		String[] arrProdHtml = null;
-		arrProdHtml = makeArrayToString(goodsDesc.getGoodsDesc(), 3800);
-		if (arrProdHtml.length > 0) {
-			for (int i = 0; i < arrProdHtml.length; i++) {
-				if (!arrProdHtml[i].isEmpty()) {
-					goodsDesc.setSeq(i + 1);
-					goodsDesc.setGoodsDesc(arrProdHtml[i]);
-					goodsDao.createGoodsDesc(goodsDesc);
-				}
-			}
-		}
-	}
-
-	/**
-	 * String => byte array
-	 *
-	 * @param raw
-	 * @param len
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	public static String[] makeArrayToString(String raw, int len) {
-
-		String[] ary = null;
-
-		if (raw == null) {
-			return ary;
-		}
-
-		try {
-
-			// raw 의 byte
-			byte[] rawBytes = raw.getBytes("UTF-8"); // MS949
-			int rawLength = rawBytes.length;
-
-			if (rawLength > len) {
-				int aryLength = (rawLength / len) + (rawLength % len != 0 ? 1 : 0);
-				ary = new String[aryLength];
-
-				int endCharIndex = 0; // 문자열이 끝나는 위치
-				String tmp;
-				for (int i = 0; i < aryLength; i++) {
-
-					if (i == (aryLength - 1)) {
-						tmp = raw.substring(endCharIndex);
-					} else {
-
-						int useByteLength = 0;
-						int rSize = 0;
-						for (; endCharIndex < raw.length(); endCharIndex++) {
-
-							if (raw.charAt(endCharIndex) > 0x007F) {
-								useByteLength += 3;
-							} else {
-								useByteLength++;
-							}
-							if (useByteLength > len) {
-								break;
-							}
-							rSize++;
-						}
-						tmp = raw.substring((endCharIndex - rSize), endCharIndex);
-					}
-
-					ary[i] = tmp;
-				}
-
-			} else {
-				ary = new String[] {raw};
-			}
-
-		} catch (java.io.UnsupportedEncodingException e) {
-		}
-
-		return ary;
-	}
-
-	/**
-	 * 옵션/재고 변경 - 상품상세
-	 *
-	 * @param goods
-	 * @param index
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	private void saveStock(Goods goods) {
-		int index = 0;
-		Option stock = new Option();
-		stock.setGoodsCd(goods.getGoodsCd());
-		stock.setUpdNo(goods.getUpdNo());
-		stock.setRegNo(goods.getRegNo());
-		goodsDao.createStockHst(stock);
-
-		for (String optCd : goods.getOptCd()) {
-			Option goodsStock = new Option();
-			goodsStock.setGoodsCd(goods.getCompsGoodsCd()[index]); // 구성상품 코드
-			goodsStock.setOptCd(optCd);
-			goodsStock.setOptNm1(goods.getOptNm1()[index]);
-			goodsStock.setOptNm2(goods.getOptNm2()[index]);
-			goodsStock.setBaseStockQty(Integer.parseInt(goods.getBaseStockQty()[index]));
-			goodsStock.setSoldoutYn(goods.getSoldoutYn()[index]);
-			goodsStock.setDispOrd(goods.getDispOrd()[index]);
-			goodsStock.setDispYn(goods.getDispYn()[index]);
-			goodsStock.setRegNo(goods.getRegNo());
-			goodsStock.setUpdNo(goods.getUpdNo());
-
-			if ("N".equals(goods.getSelfGoodsYn())) {
-				goodsStock.setSelfGoodsYn(goods.getSelfGoodsYn());
-				goodsStock.setCurrStockQty(Integer.parseInt(goods.getEditCurrStockQty()[index]));
-			}
-			goodsDao.saveStock(goodsStock);
-			index++;
-		}
-	}
-
-	/**
-	 * 상품 정보고시 변경 - 상품상세
-	 *
-	 * @param goods
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	private void saveGoodsNotiInfo(Goods goods) {
-		int index;
-		if (goods.getNotiListNew() != null && !goods.getNotiListNew().isEmpty()) {
-			index = 0;
-			for (GoodsNotiInfo goodsNotiInfo : goods.getNotiListNew()) {
-				if (index == 0) {
-					goodsDao.deleteGoodsNotiInfo(goods);
-				}
-				goodsNotiInfo.setNiContent(GagaStringUtil.replace(GagaStringUtil.replace(goodsNotiInfo.getNiContent(), "&lt;", "<"), "&gt;", ">"));
-				goodsNotiInfo.setRegNo(goods.getRegNo());
-				goodsNotiInfo.setUpdNo(goods.getUpdNo());
-				goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
-				index++;
-			}
-		}
-	}
-
-	/**
-	 * 딜상품 저장
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	@Transactional("shopTxnManager")
-	public void saveGoodsDeal(Goods goods) {
-
-		Goods regGoods = new Goods();
-
-		// <,> replace 처리
-		regGoods.setRegNo(TsaSession.getInfo().getUserNo());
-		regGoods.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		String goodsCd = this.getGoodsCodeSeq("D", "D");
-		regGoods.setGoodsCd(goodsCd);
-		regGoods.setSupplyGoodsCd(goodsCd);
-		regGoods.setGoodsType("G056_D");
-		regGoods.setSupplyCompCd(goods.getSupplyCompCd());
-		regGoods.setBrandCd(goods.getBrandCd());
-		regGoods.setItemkindCd(goods.getItemkindCd());
-		regGoods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
-		regGoods.setStyleYear(goods.getStyleYear());
-		regGoods.setSeasonCd(goods.getSeasonCd());
-		regGoods.setSexGb(goods.getSexGb());
-		regGoods.setColorCd(goods.getColorCd());
-		regGoods.setMainColorYn("Y");
-		regGoods.setMakeNm(goods.getMakeNm());
-		regGoods.setMakeYmd(goods.getMakeYmd());
-		regGoods.setSelfMallYn(goods.getSelfMallYn());
-		regGoods.setGoodsStat("G008_20"); // 정보부족
-		regGoods.setFormalGb("G009_10"); // 정상 기본값 처리
-		regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
-		regGoods.setDistributionGb("G065_12"); // 유통구분
-		regGoods.setGoodsNum(goodsCd);
-
-		regGoods.setListPrice(goods.getCurrPrice());
-		regGoods.setCurrPrice(goods.getCurrPrice());
-		regGoods.setDcRate((int)(this.getDcRate(goods.getCurrPrice(), goods.getCurrPrice())));
-
-		Collection<GoodsCompose> goodsComposeList = null;
-		try {
-			goodsComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
-			});
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new IllegalStateException(message.getMessage("딜상품 저장 중 오류로 인해 저장되지 않았습니다."));
-		}
-
-		for (GoodsCompose goodsCompose : goodsComposeList) {
-			goodsCompose.setGoodsCd(regGoods.getGoodsCd());
-			goodsCompose.setGoodsType(regGoods.getGoodsType());
-			goodsCompose.setRegNo(TsaSession.getInfo().getUserNo());
-			goodsCompose.setUpdNo(TsaSession.getInfo().getUserNo());
-
-			Goods extendGoods = new Goods();
-			extendGoods.setGoodsCd(goodsCompose.getCompsGoodsCd());
-			extendGoods = goodsDao.getGoods(extendGoods);
-			if (StringUtils.isEmpty(extendGoods.getBrandCd())) {
-				throw new IllegalStateException(message.getMessage("구성상품 중 " + goodsCompose.getCompsGoodsCd() + " 상품 정보를 확인해 주세요."));
-			}
-
-			if ("Y".equals(goodsCompose.getBaseYn())) {
-				regGoods.setBrandCd(extendGoods.getBrandCd());
-				regGoods.setItemkindCd(extendGoods.getItemkindCd());
-				regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
-				regGoods.setFormalGb(extendGoods.getFormalGb());
-			}
-		}
-
-		this.createGoodsExtend(regGoods, goodsComposeList); // 딜상품 관련 정보 저장
-	}
-
-	/**
-	 * 세트상품 저장
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 04
-	 */
-	@Transactional("shopTxnManager")
-	public void saveGoodsSet(Goods goods) {
-
-		Goods regGoods = new Goods();
-
-		// <,> replace 처리
-		regGoods.setRegNo(TsaSession.getInfo().getUserNo());
-		regGoods.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		String goodsCd = this.getGoodsCodeSeq("S", "S");
-		regGoods.setGoodsCd(goodsCd);
-		regGoods.setSupplyGoodsCd(goodsCd);
-		regGoods.setGoodsType("G056_S");
-		regGoods.setSupplyCompCd(goods.getSupplyCompCd());
-		regGoods.setBrandCd(goods.getBrandCd());
-		regGoods.setItemkindCd(goods.getItemkindCd());
-		regGoods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
-		regGoods.setStyleYear(goods.getStyleYear());
-		regGoods.setSeasonCd(goods.getSeasonCd());
-		regGoods.setSexGb(goods.getSexGb());
-		regGoods.setColorCd(goods.getColorCd());
-		regGoods.setMainColorYn("Y");
-		regGoods.setMakeNm(goods.getMakeNm());
-		regGoods.setMakeYmd(goods.getMakeYmd());
-		regGoods.setSelfMallYn(goods.getSelfMallYn());
-		regGoods.setGoodsStat("G008_20"); // 정보부족
-		regGoods.setFormalGb("G009_10"); // 정상 기본값 처리
-		regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
-		regGoods.setDistributionGb("G065_12"); // 유통구분
-		regGoods.setGoodsNum(goodsCd);
-
-		Collection<GoodsCompose> goodsComposeList = null;
-		try {
-			goodsComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
-			});
-		} catch (Exception e) {
-			throw new IllegalStateException(message.getMessage("세트상품 저장 중 오류로 인해 저장되지 않았습니다."));
-		}
-
-		int listPriceSum = 0;
-		int currPriceSum = 0;
-		for (GoodsCompose goodsCompose : goodsComposeList) {
-			goodsCompose.setGoodsCd(regGoods.getGoodsCd());
-			goodsCompose.setGoodsType(regGoods.getGoodsType());
-			goodsCompose.setRegNo(TsaSession.getInfo().getUserNo());
-			goodsCompose.setUpdNo(TsaSession.getInfo().getUserNo());
-
-			Goods extendGoods = new Goods();
-			extendGoods.setGoodsCd(goodsCompose.getCompsGoodsCd());
-			extendGoods = goodsDao.getGoods(extendGoods);
-			if (StringUtils.isEmpty(extendGoods.getBrandCd())) {
-				throw new IllegalStateException(message.getMessage("구성상품 중 " + goodsCompose.getCompsGoodsCd() + " 상품 정보를 확인해 주세요."));
-			}
-			listPriceSum += extendGoods.getListPrice();
-			currPriceSum += goodsCompose.getCompsCurrPrice(); // 입력값
-
-			if ("Y".equals(goodsCompose.getBaseYn())) {
-				regGoods.setBrandCd(extendGoods.getBrandCd());
-				regGoods.setItemkindCd(extendGoods.getItemkindCd());
-				regGoods.setGoodsNum(extendGoods.getGoodsNum());
-				regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
-				regGoods.setFormalGb(extendGoods.getFormalGb());
-			}
-		}
-
-		regGoods.setListPrice(listPriceSum);
-		regGoods.setCurrPrice(currPriceSum);
-		regGoods.setDcRate((int)(this.getDcRate(listPriceSum, currPriceSum)));
-
-		this.createGoodsExtend(regGoods, goodsComposeList); // 세트상품 관련 정보 저장
-	}
-
-	/**
-	 * 세트/딜 상품 관련 저장
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	private void createGoodsExtend(Goods regGoods, Collection<GoodsCompose> goodsComposeList) {
-		// 브랜드 확인
-		Brand brand = new Brand();
-		brand.setBrandCd(regGoods.getBrandCd());
-		brand.setSupplyCompCd(regGoods.getSupplyCompCd());
-		Collection<Brand> brandList = businessService.getBrandList(brand);
-		if (brandList == null || brandList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("구성상품 중 기준 상품의 브랜드를 확인해 주세요."));
-		}
-
-		int delvFee = 0;
-		int minOrdAmt = 0;
-		float pntPrate = 0.0f;
-		float pntMrate = 0.0f;
-		float sellFeeRate = 0.0f;
-		for (Brand tmpBrand : brandList) {
-
-			delvFee = tmpBrand.getDelvFee();
-			minOrdAmt = tmpBrand.getMinOrdAmt();
-			if ("10".equals(regGoods.getFormalGb())) {
-				pntPrate = tmpBrand.getPntPrate10();
-				pntMrate = tmpBrand.getPntMrate10();
-			} else {
-				pntPrate = tmpBrand.getPntPrate20();
-				pntMrate = tmpBrand.getPntMrate20();
-			}
-			sellFeeRate = tmpBrand.getSellFeeRate();
-		}
-		regGoods.setDelvFee(delvFee); // 배송비
-		regGoods.setMinOrdAmt(minOrdAmt); // 무료배송비최소구매금액
-		regGoods.setPntPrate(pntPrate); // 포인트적립율(PC)
-		regGoods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
-		regGoods.setSellFeeRate(sellFeeRate); // 판매수수료율
-		regGoods.setSelfGoodsYn("Y");
-
-		// 스타일 연도
-		regGoods.setStyleYear(regGoods.getStyleYear());
-
-		goodsDao.createGoods(regGoods); // 상품기본 저장
-		goodsDao.createGoodsSmmary(regGoods); // 상품통계 생성
-
-		StringBuilder goodsDescSb = new StringBuilder(); // 상품상세
-
-		int dispOrd = 1;
-		for (GoodsCompose regGoodsExtend : goodsComposeList) {
-			regGoodsExtend.setDispOrd(dispOrd);
-			goodsDao.saveGoodsCompose(regGoodsExtend); // 구성상품기본 저장
-			dispOrd++;
-		}
-
-		// 사용자 검색어를 검색어에 적용
-		String goodsSnm = goodsDao.getGoodsSnm(regGoods.getGoodsCd());
-		regGoods.setGoodsSnm(goodsSnm);
-		goodsDao.updateGoodsSnm(regGoods);
-		// 카테고리 전시
-		// 추후 작업 해야함 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-		//goodsDao.createCategoryGoods(regGoods);
-
-		// 추후 작업 해야함 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-		// 대표 이미지만 생성
-//		GoodsImg goodsImg = new GoodsImg();
-//		goodsImg.setGoodsCd(regGoods.getGoodsCd());
-//		goodsImg.setImgType("A");
-//		// 이미지 경로 확인하자!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-//		goodsImg.setImgPath1(this.getGoodsImgPath(regGoods.getGoodsCd(), regGoods.getBrandCd()) + "01.jpg");
-//		goodsImg.setRegNo(TsaSession.getInfo().getUserNo());
-//		goodsImg.setUpdNo(TsaSession.getInfo().getUserNo());
-//		goodsDao.saveGoodsImgInfo(goodsImg);
-	}
-
-	/**
-	 * 품 이미지 경로생성
-	 *
-	 * @param goodsCd
-	 * @param brandCd
-	 * @return String
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	private String getGoodsImgPath(String goodsCd, String brandCd) {
-		return "/" + goodsCd.substring(0, 1) + "/" + goodsCd.substring(0, 3) + "/" + goodsCd + "/1000/" + goodsCd + "_";
-	}
-
-	/**
-	 * 상품 코드 생성
-	 *
-	 * @param goodsType - 상품타입
-	 * @param goodsCdAfter - 상품시퀀스 앞에 붙는명
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	public String getGoodsCodeSeq(String goodsType, String goodsCdAfter) {
-
-		//상품코드 12자리
-		String goodsCd = "";
-		Goods goods = new Goods();
-		goodsDao.createGoodsSequence(goods);
-		String goodsSeq = GagaStringUtil.getLPadding(Integer.toString(goods.getGoodsSq()), 9, "0");
-		if ("S".equals(goodsType) || "D".equals(goodsType)) {
-			goodsCd = SELF_GOOODS_AFTER + goodsCdAfter + goodsSeq;
-
-		} else {
-			goodsCd = goodsCdAfter + goodsSeq; // 입점 : 브랜드코드
-		}
-		return goodsCd;
-	}
-
-	/**
-	 * 상품 타이틀 관리 목록 건수
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11 .02
-	 */
-	public int getGoodsTitleReserveCount(GoodsSearch goodsSearch) {
-		return goodsDao.getGoodsTitleReserveCount(goodsSearch);
-	}
-
-	/**
-	 * 상품 타이틀 관리 목록
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11 .02
-	 */
-	public Collection<GoodsTnmRes> getGoodsTitleReserveList(GoodsSearch goodsSearch) {
-		return goodsDao.getGoodsTitleReserveList(goodsSearch);
-	}
-
-	/**
-	 * 상품 타이틀 예약 등록
-	 *
-	 * @param goodsTnmRes
-	 * @author eskim
-	 * @since 2020. 11 .02
-	 */
-	@Transactional("shopTxnManager")
-	public void saveGoodsRsvtTnm(GoodsTnmRes goodsTnmRes) {
-		if (goodsTnmRes.getArrGoodsCd().length <= 0) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		goodsTnmRes.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goodsTnmRes.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
-
-		for (String goodsCd : goodsTnmRes.getArrGoodsCd()) {
-
-			goodsTnmRes.setGoodsCd(goodsCd);
-			goodsTnmRes.setRegNo(TsaSession.getInfo().getUserNo());
-			goodsTnmRes.setUpdNo(TsaSession.getInfo().getUserNo());
-
-			if (goodsDao.getGoodsTnmDupChkCount(goodsTnmRes) > 0) {
-				throw new IllegalStateException("이미 등록된 상품 타이틀예약이 등록하려는 예약기간내에 존재합니다. \n(상품코드 : " + goodsCd + ")");
-			}
-
-			goodsDao.createGoodTnmRes(goodsTnmRes);
-
-			// 현재일자가 예약기간에 포함되어 있으면 바로 적용한다.
-			String toDaytime = GagaDateUtil.getTodayDateTime();
-			if (Long.parseLong(toDaytime) >= Long.parseLong(goodsTnmRes.getApplyStdt()) && Long.parseLong(toDaytime) <= Long.parseLong(goodsTnmRes.getApplyEddt())) {
-
-				// 이력생성 및 상품타이틀 수정
-				Goods goods = new Goods();
-				goods.setGoodsCd(goodsCd);
-				goods.setGoodsTnm(goodsTnmRes.getGoodsTnm());
-				goods.setRegNo(TsaSession.getInfo().getUserNo());
-				goods.setUpdNo(TsaSession.getInfo().getUserNo());
-
-				goodsDao.createGoodsHst(goods);
-				goodsDao.updateGoodTnm(goods);
-			}
-
-		}
-	}
-
-	/**
-	 * 상품 타이틀 예약 삭제
-	 *
-	 * @param goodsTnmRes
-	 * @author eskim
-	 * @since 2020. 11 .02
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteGoodsRsvtTnm(GoodsTnmRes goodsTnmRes) {
-		if (goodsTnmRes.getArrGoodsCd().length <= 0) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		int idx = 0;
-		for (String goodsCd : goodsTnmRes.getArrGoodsCd()) {
-
-			// 상품 타이틀 예약 삭제
-			goodsTnmRes.setGoodsTnmResSq(goodsTnmRes.getArrGoodsTnmResSq()[idx]);
-			goodsDao.deleteGoodTnmRes(goodsTnmRes);
-
-			// 상품 타이틀 예약건 초기화
-			Goods goods = new Goods();
-			goods.setGoodsCd(goodsCd);
-			goods = goodsDao.getGoodTnmInit(goods);
-			goods.setRegNo(TsaSession.getInfo().getUserNo());
-			goods.setUpdNo(TsaSession.getInfo().getUserNo());
-
-			if (!StringUtils.isEmpty(goods.getGoodsTnm()) && !goods.getGoodsTnm().equals(goods.getGoodTnmInit())) {
-
-				// 상품이력 먼저 쌓기
-				goodsDao.createGoodsHst(goods);
-				// 정보수정
-				goods.setGoodsTnm(goods.getGoodTnmInit());
-				goodsDao.updateGoodTnm(goods);
-
-			}
-			idx++;
-		}
-	}
-
-	/**
-	 * 네이버 EP 제외 상품 목록 건수
-	 *
-	 * @param goodsSearch
-	 * @return int
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	public int getGoodsEpSkipCount(GoodsSearch goodsSearch) {
-		return goodsDao.getGoodsEpSkipCount(goodsSearch);
-	}
-
-	/**
-	 * 네이버 EP 제외 상품 목록
-	 *
-	 * @param goodsSearch
-	 * @return Collection<TsaGoodsEpSkip>
-	 * @author daehyoung
-	 * @since 2020. 11. 03
-	 */
-	public Collection<GoodsEpSkip> getGoodsEpSkipList(GoodsSearch goodsSearch) {
-		return goodsDao.getGoodsEpSkipList(goodsSearch);
-	}
-
-	/**
-	 * 네이버 EP 제외 상품 예약 등록
-	 *
-	 * @param goodsEpSkip
-	 * @return void
-	 * @author daehyoung
-	 * @since 2020. 11. 03
-	 */
-	@Transactional("shopTxnManager")
-	public void saveGoodsRsvtEpSkip(GoodsEpSkip goodsEpSkip) {
-		if (goodsEpSkip.getArrGoodsCd().length <= 0) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		for (String goodsCd : goodsEpSkip.getArrGoodsCd()) {
-
-			goodsEpSkip.setGoodsCd(goodsCd);
-			goodsEpSkip.setRegNo(TsaSession.getInfo().getUserNo());
-			goodsEpSkip.setUpdNo(TsaSession.getInfo().getUserNo());
-
-			if (goodsDao.getGoodsEpSkipDupChkCount(goodsEpSkip) > 0) {
-				throw new IllegalStateException("비노출예약이 중복된 상품이 존재합니다.<br/>(상품코드 : " + goodsCd + ")");
-			}
-			goodsDao.createGoodEpSkip(goodsEpSkip);
-		}
-	}
-
-	/**
-	 * 네이버 EP 제외 상품 예약 삭제
-	 *
-	 * @param goodsEpSkip
-	 * @return void
-	 * @author daehyoung
-	 * @since 2020. 11. 03
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteGoodsEpSkip(GoodsEpSkip goodsEpSkip) {
-		if (goodsEpSkip.getArrGoodsCd().length <= 0) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-		int idx = 0;
-		for (String goodsCd : goodsEpSkip.getArrGoodsCd()) {
-			goodsEpSkip.setGoodsEpSkipSq(goodsEpSkip.getArrGoodsEpSkipSq()[idx]);
-			goodsDao.deleteGoodEpSkip(goodsEpSkip);
-			idx++;
-		}
-	}
-
-	/**
-	 * 상품 상세공지 목록
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 05
-	 */
-	public Collection<Notice> getNoticeList(GoodsSearch goodsSearch) {
-		return goodsDao.getNoticeList(goodsSearch);
-	}
-
-	/**
-	 * 상품 상세공지 상품 목록
-	 *
-	 * @param notice
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 06
-	 */
-	public Collection<NoticeGoods> getNoticeGoodsList(Notice notice) {
-		return goodsDao.getNoticeGoodsList(notice);
-	}
-
-	/**
-	 * 공지사항 저장
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 05
-	 */
-	@Transactional("shopTxnManager")
-	public void saveNotice(Notice notice) {
-		notice.setRegNo(TsaSession.getInfo().getUserNo());
-		notice.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		// 신규 일때
-		if (notice.getNoticeSq() == null) {
-			// 공지사항 저장
-			noticeService.createNotice(notice);
-
-			// 등록된 사용자번호 값 가져오기
-			Integer noticeSq = notice.getNoticeSq();
-
-			notice.setNoticeSq(noticeSq);
-
-		} else {
-			// 공지사항 수정
-			noticeService.updateNotice(notice);
-		}
-
-		if (!StringUtils.isEmpty(notice.getGoodsList())) {
-			Collection<NoticeGoods> noticeGoodsList = null;
-			try {
-				noticeGoodsList = mapper.readValue(notice.getGoodsList(), new TypeReference<Collection<NoticeGoods>>() {
-				});
-			} catch (Exception e) {
-				e.printStackTrace();
-				throw new IllegalStateException(message.getMessage("상품상세공지 저장 중 오류로 인해 저장되지 않았습니다."));
-			}
-			log.info("noticeGoodsList: {}", noticeGoodsList);
-			for (NoticeGoods noticeGoods : noticeGoodsList) {
-				noticeGoods.setNoticeSq(notice.getNoticeSq());
-				noticeGoods.setRegNo(TsaSession.getInfo().getUserNo());
-				noticeGoods.setUpdNo(TsaSession.getInfo().getUserNo());
-
-				goodsDao.saveNoticeGoods(noticeGoods);
-			}
-
-		}
-	}
-
-	/**
-	 * 공지사항 상품 삭제
-	 * @param noticeGoods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 06
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteNoticeGoods(NoticeGoods noticeGoods) {
-		goodsDao.deleteNoticeGoods(noticeGoods);
-	}
-}
+package com.style24.admin.biz.service;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.style24.admin.biz.dao.TsaGoodsDao;
+import com.style24.admin.support.env.TsaConstants;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsCompose;
+import com.style24.persistence.domain.GoodsDesc;
+import com.style24.persistence.domain.GoodsEpSkip;
+import com.style24.persistence.domain.GoodsHst;
+import com.style24.persistence.domain.GoodsNotiInfo;
+import com.style24.persistence.domain.GoodsSearch;
+import com.style24.persistence.domain.GoodsTnmRes;
+import com.style24.persistence.domain.Itemkind;
+import com.style24.persistence.domain.NotiInfo;
+import com.style24.persistence.domain.Notice;
+import com.style24.persistence.domain.NoticeGoods;
+import com.style24.persistence.domain.Option;
+import com.style24.persistence.domain.SearchData;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.excel.GagaExcelUtil;
+import com.gagaframework.excel.env.GagaExcelConstants;
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
+import com.gagaframework.web.util.GagaStringUtil;
+
+/**
+ *상품관리 Service
+ *
+ * @author eskim
+ * @since 2020. 10. 16
+ */
+@Service
+@Slf4j
+public class TsaGoodsService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TsaGoodsDao goodsDao;
+
+	@Autowired
+	private TsaBusinessService businessService;
+
+	@Autowired
+	private TsaCommonService commonService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private TsaNoticeService noticeService;
+
+
+
+	@Autowired
+	private ObjectMapper mapper;
+
+	private static final String NUMBER_PATTERN = "^[0-9]+$";
+
+	private static final String SELF_GOOODS_AFTER = "STY";
+
+	/**
+	 * 상품 할인율 계산
+	 *
+	 * @param value
+	 * @param len
+	 * @param pad
+	 * @return
+	 */
+	private long getDcRate(int listPrice, int currPrice) {
+		double rate = (double)(currPrice) / (double)(listPrice);
+		return 100 - (long)((Math.round(rate * 100) / 100.0) * 100);
+	}
+
+	/**
+	 * 품목 목록
+	 * @param itemkind
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	public Collection<Itemkind> getItemkindList(Itemkind itemkind) {
+		return goodsDao.getItemkindList(itemkind);
+	}
+
+	/**
+	 * 품목 저장
+	 *
+	 * @param itemkindList - 품목 정보 목록
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@Transactional("shopTxnManager")
+	public void saveItemkindInfo(Collection<Itemkind> itemkindList) {
+		for (Itemkind itemkind : itemkindList) {
+			itemkind.setRegNo(TsaSession.getInfo().getUserNo());
+			itemkind.setUpdNo(TsaSession.getInfo().getUserNo());
+			itemkind.setItemkindNm(GagaStringUtil.replace(GagaStringUtil.replace(itemkind.getItemkindNm(), "&lt;", "<"),"&gt;", ">"));
+			//itemkind.setItemkindEnm(GagaStringUtil.replace(GagaStringUtil.replace(itemkind.getItemkindEnm(), "&lt;", "<"),"&gt;", ">"));
+			goodsDao.saveItemkindInfo(itemkind);
+		}
+	}
+
+	/**
+	 * 품목 삭제
+	 *
+	 * @param itemkindList - 품목 정보 목록
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteItemkindInfo(Collection<Itemkind> itemkindList) {
+		for (Itemkind itemkind : itemkindList) {
+			goodsDao.deleteItemkindInfo(itemkind);
+		}
+	}
+
+	/**
+	 * 색상목록 조회
+	 *
+	 * @param color
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	public Collection<Color> getColorList(Color color) {
+		return goodsDao.getColorList(color);
+	}
+
+	/**
+	 * 색상 저장
+	 *
+	 * @param colorList
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@Transactional("shopTxnManager")
+	public void saveColor(Collection<Color> colorList) {
+
+		for (Color color : colorList) {
+
+			color.setRegNo(TsaSession.getInfo().getUserNo());
+			color.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			goodsDao.saveColor(color);
+		}
+	}
+
+	/**
+	 * 상품정보고시 목록
+	 *
+	 * @param notiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 19
+	 */
+	public Collection<NotiInfo> getNotiInfoList(NotiInfo notiInfo) {
+		return goodsDao.getNotiInfoList(notiInfo);
+	}
+
+	/**
+	 * 상품정보고시 항목 목록
+	 *
+	 * @param notiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 19
+	 */
+	public Collection<NotiInfo> getNotiInfoItemList(NotiInfo notiInfo) {
+		return goodsDao.getNotiInfoItemList(notiInfo);
+	}
+
+	/**
+	 * 상품정보고시 항목 저장
+	 *
+	 * @param notiInfoList
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 19
+	 */
+	@Transactional("shopTxnManager")
+	public void saveNotiInfoItem(Collection<NotiInfo> notiInfoList) {
+		if (notiInfoList == null || notiInfoList.isEmpty())
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+
+		for (NotiInfo notiInfo : notiInfoList) {
+			if (!StringUtils.isEmpty(notiInfo.getNiContent())) {
+				notiInfo.setNiContent(GagaStringUtil.replace(GagaStringUtil.replace(notiInfo.getNiContent(),"&lt;", "<"),"&gt;", ">"));
+			}
+			notiInfo.setRegNo(TsaSession.getInfo().getUserNo());
+			notiInfo.setUpdNo(TsaSession.getInfo().getUserNo());
+			goodsDao.saveNotiInfo(notiInfo);
+		}
+	}
+
+	/**
+	 * 상품 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 20
+	 */
+	public int getGoodsListCount(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsListCount(goodsSearch);
+	}
+
+	/**
+	 * 상품 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 20
+	 */
+	public Collection<Goods> getGoodsList(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsList(goodsSearch);
+	}
+
+	/**
+	 * 상품목록 - 기본정보 엑셀다운로드
+	 *
+	 * @param goodsSearch
+	 * @param excelFilenameWithPath - 경로를 포함한 엑셀파일명
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 21
+	 */
+	public void getGoodsInfoExcelList(GoodsSearch goodsSearch, String excelFilenameWithPath) {
+
+		if ("Y".equals(goodsSearch.getImageViewYn())) {
+			// 헤더 title 설정
+			String[] listTitles = {"이미지", "상품코드", "업체명", "브랜드명", "상품명", "품목", "재고", "상품상태", "스타일년도", "시즌",
+				"정상가", "판매가", "할인율", "가격변경일", "ERP재고연동여부", "정상이월구분", "반품가능 여부","승인일시"};
+
+			// DB 처리 시 사용되는 파라미터명(셀명) 설정
+			String[] cellNames = {"IMG_PATH1", "GOODS_CD", "SUPPLY_COMP_CD", "BRAND_GRP_NM", "GOODS_NM", "ITEMKIND_NM",
+				"STOCK_QTY_SUM", "GOODS_STAT", "STYLE_YEAR", "SEASON_CD",  "LIST_PRICE", "CURR_PRICE",
+				"DC_RATE", "PRICE_UPD_DT", "ERP_STOCK_LINK_YN", "FORMAL_GB", "RETURNABLE_YN", "FRST_CFRM_DT"};
+
+			String[] cellTypes = {GagaExcelConstants.CellType.IMAGE.name(),
+				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
+				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
+				GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
+				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+				GagaExcelConstants.CellType.CHAR_CENTER.name(),
+				GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name()};
+
+			String targetPath = env.getProperty("upload.goods.view");
+			Collection<GagaMap> dataList = goodsDao.getGoodsInfoExcelList(goodsSearch); // map형식으로 조회
+			if (dataList != null && !dataList.isEmpty()) {
+				for (GagaMap gagaMap : dataList) {
+					if ("A".equals(gagaMap.get("IMG_TYPE").toString())) {
+						gagaMap.set("IMG_PATH1", gagaMap.get("IMG_PATH1").toString());
+					} else {
+
+						if (!StringUtils.isEmpty(gagaMap.get("IMG_PATH6"))) {
+							gagaMap.set("IMG_PATH1", targetPath + gagaMap.get("IMG_PATH6").toString());
+
+						} else {
+							gagaMap.set("IMG_PATH1", targetPath + gagaMap.get("IMG_PATH1").toString());
+						}
+					}
+				}
+			}
+
+			try {
+				GagaExcelUtil.createExcel(excelFilenameWithPath, dataList, "상품 정보", listTitles, cellNames, cellTypes, TsaConstants.EXCEL_FOOTER_TITLE);
+			} catch (Exception e) {
+				throw new IllegalStateException(e);
+			}
+
+		} else {
+			// 헤더 title 설정
+			String[] listTitles = {"상품코드", "업체명", "브랜드명", "상품명", "품목", "재고", "상품상태", "스타일년도",
+				"시즌",  "정상가", "판매가", "할인율", "가격변경일", "ERP재고연동여부", "정상이월구분", "반품가능 여부", "승인일시"};
+
+			// DB 처리 시 사용되는 파라미터명(셀명) 설정
+			String[] cellNames = {"GOODS_CD", "SUPPLY_COMP_CD", "BRAND_GRP_NM", "GOODS_NM", "ITEMKIND_NM", "STOCK_QTY_SUM", "GOODS_STAT", "STYLE_YEAR",
+				"SEASON_CD",  "LIST_PRICE", "CURR_PRICE", "DC_RATE", "PRICE_UPD_DT", "ERP_STOCK_LINK_YN", "FORMAL_GB", "RETURNABLE_YN", "FRST_CFRM_DT"};
+
+			String[] cellTypes = {
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
+			GagaExcelConstants.CellType.CHAR_RIGHT.name(), GagaExcelConstants.CellType.CHAR_RIGHT.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name(),
+			GagaExcelConstants.CellType.CHAR_CENTER.name(), GagaExcelConstants.CellType.CHAR_CENTER.name()};
+
+			Collection<GagaMap> dataList = goodsDao.getGoodsInfoExcelList(goodsSearch);
+
+			try {
+				GagaExcelUtil.createExcel(excelFilenameWithPath, dataList, "상품 정보", listTitles, cellNames, cellTypes, TsaConstants.EXCEL_FOOTER_TITLE);
+			} catch (Exception e) {
+				throw new IllegalStateException(e);
+			}
+		}
+	}
+
+	/**
+	 * 상품 이미지 등록여부 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 21
+	 */
+	public Collection<Goods> getGoodsImgsYn(Goods goods) {
+		return goodsDao.getGoodsImgsYn(goods);
+	}
+
+	/**
+	 * 상품 상세
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	public Goods getGoods(Goods goods) {
+		// 상품기본정보
+		Goods resultGoods = goodsDao.getGoods(goods);
+
+		// 상품 상세
+		this.getGoodsDesc(resultGoods);
+		return resultGoods;
+	}
+
+	/**
+	 * 상품 상세 조회
+	 *
+	 * @param resultGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	private Goods getGoodsDesc(Goods resultGoods) {
+
+		GoodsDesc goods = new GoodsDesc();
+		goods.setGoodsCd(resultGoods.getGoodsCd());
+
+		//		goods.setDescGb("10");
+		//		String goodsDesc = this.getGoodsDescList(goods);
+		//		resultGoods.setGoodsDesc(goodsDesc);
+
+		// 상품 상세 pc 상단
+		goods.setDescGb("20");
+		String goodsPcTopDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsPcTopDesc(goodsPcTopDesc);
+
+		// 상품 상세  pc 하단
+		goods.setDescGb("30");
+		String goodsPcDownDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsPcDownDesc(goodsPcDownDesc);
+
+		// 상품 상세 mobile 상단
+		goods.setDescGb("40");
+		String goodsMobileTopDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsMobileTopDesc(goodsMobileTopDesc);
+
+		// 상품 상세 mpbile 하단
+		goods.setDescGb("50");
+		String goodsMobileDownDesc = this.getGoodsDescList(goods);
+		resultGoods.setGoodsMobileDownDesc(goodsMobileDownDesc);
+
+		return resultGoods;
+	}
+
+	/**
+	 * 상품 상세구분별 컨텐츠 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	private String getGoodsDescList(GoodsDesc goodsDesc) {
+		Collection<GoodsDesc> goodsDescList = goodsDao.getGoodsDescList(goodsDesc);
+		StringBuilder goodsDescSb = new StringBuilder();
+		if (goodsDescList != null && !goodsDescList.isEmpty()) {
+			for (GoodsDesc tmpGoodsDesc : goodsDescList) {
+				goodsDescSb.append(tmpGoodsDesc.getGoodsDesc());
+			}
+		}
+		return goodsDescSb.toString();
+	}
+
+	/**
+	 * 상품 정보 이력 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2019. 12. 12
+	 */
+	public Collection<GoodsHst> getGoodsHstList(Goods goods) {
+		return goodsDao.getGoodsHstList(goods);
+	}
+
+	/**
+	 * 상품 옵션 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 26
+	 */
+	public Collection<Option> getGoodsSizeList(Goods goods) {
+		return goodsDao.getGoodsSizeList(goods);
+	}
+
+	/**
+	 * 상품 정보고시 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	public Collection<GoodsNotiInfo> getGoodsNotiInfoList(GoodsNotiInfo goodsNotiInfo) {
+		return goodsDao.getGoodsNotiInfoList(goodsNotiInfo);
+	}
+
+	/**
+	 * 구성상품 목록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	public Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods) {
+		return goodsDao.getGoodsDetailComposeList(goods);
+	}
+
+	/**
+	 * 같은 품번 상품목록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	public Collection<Goods> getGoodsNumGoodsList(Goods goods) {
+		return goodsDao.getGoodsNumGoodsList(goods);
+	}
+
+
+	/**
+	 * 상품 수정 항목 일괄변경
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 01. 17
+	 */
+	@Transactional("shopTxnManager")
+	public void updateGoodsState(Goods goods) {
+		if (goods == null || (goods.getArrGoodsCd() == null && goods.getArrGoodsCd().length <= 0)) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		goods.setRegNo(TsaSession.getInfo().getUserNo());
+		goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		if (goods.getArrGoodsCd().length > 0) {
+			for (String goodsCd : goods.getArrGoodsCd()) {
+
+				goods.setGoodsCd(goodsCd);
+				// 이력생성
+				goodsDao.createGoodsHst(goods);
+
+				if ("formalGb".equals(goods.getProcJob())) {
+					// 상품브랜드 조회
+					Goods originGoods = goodsDao.getGoods(goods);
+					// 브랜드 확인
+					goods.setPntPrate(originGoods.getPntPrate()); // 포인트적립율(PC)
+					goods.setPntMrate(originGoods.getPntMrate()); // 포인트적립율(MOBILE)
+					Brand brand = new Brand();
+					brand.setBrandCd(originGoods.getBrandCd());
+					Collection<Brand> brandList = businessService.getBrandList(brand);
+					if (brandList != null && !brandList.isEmpty()) {
+						float pntPrate = 0;
+						float pntMrate = 0;
+						for (Brand tmpBrand : brandList) {
+							if ("G009_10".equals(goods.getFormalGb())) {
+								pntPrate = tmpBrand.getPntPrate10();
+								pntMrate = tmpBrand.getPntMrate10();
+							} else {
+								pntPrate = tmpBrand.getPntPrate20();
+								pntMrate = tmpBrand.getPntMrate20();
+							}
+						}
+						goods.setPntPrate(pntPrate); // 포인트적립율(PC)
+						goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+					}
+				} else if ("goodsStat".equals(goods.getProcJob())) {
+					// 상품브랜드 조회
+					Goods originGoods = goodsDao.getGoods(goods);
+
+					// 승인일
+					if (!goods.getGoodsStat().equals(originGoods.getGoodsStat()) && "G008_90".equals(goods.getGoodsStat())) {
+						goods.setChGoodsStatYn("Y");
+					}
+				}
+				// 상품정보 변경
+				goodsDao.updateGoodsState(goods);
+			}
+
+		} else {
+
+			// 이력생성
+			goodsDao.createGoodsHst(goods);
+			if ("formalGb".equals(goods.getProcJob())) {
+				// 상품브랜드 조회
+				Goods originGoods = goodsDao.getGoods(goods);
+				// 브랜드 확인
+				goods.setPntPrate(originGoods.getPntPrate()); // 포인트적립율(PC)
+				goods.setPntMrate(originGoods.getPntMrate()); // 포인트적립율(MOBILE)
+				Brand brand = new Brand();
+				brand.setBrandCd(originGoods.getBrandCd());
+				Collection<Brand> brandList = businessService.getBrandList(brand);
+				if (brandList != null && !brandList.isEmpty()) {
+					float pntPrate = 0;
+					float pntMrate = 0;
+					for (Brand tmpBrand : brandList) {
+						if ("G009_10".equals(goods.getFormalGb())) {
+							pntPrate = tmpBrand.getPntPrate10();
+							pntMrate = tmpBrand.getPntMrate10();
+						} else {
+							pntPrate = tmpBrand.getPntPrate20();
+							pntMrate = tmpBrand.getPntMrate20();
+						}
+					}
+					goods.setPntPrate(pntPrate); // 포인트적립율(PC)
+					goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+				}
+			}
+			// 상품정보 변경
+			goodsDao.updateGoodsState(goods);
+		}
+	}
+
+	/**
+	 * 엑셀조회용 상품 저장
+	 *
+	 * @param procJob : goodsExcelUpload
+	 * @param goodsList
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	@Transactional("shopTxnManager")
+	public void saveExceluploadGoods(Collection<Goods> goodsList, String excelFilename) {
+
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
+		if (goodsList == null || goodsList.isEmpty()) {
+			this.deleteExceluploadFile(targetPath, excelFilename);
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		int index = 0;
+		String goodsCdFlag = "";
+		String goodsNumFlag = "";
+		for (Goods goods : goodsList) {
+
+			if (!StringUtils.isEmpty(goodsCdFlag) && !StringUtils.isEmpty(goodsNumFlag)) {
+				throw new IllegalStateException("상품코드와 원코드 중 한 개의 셀에만 값을 입력해서 조회하세요.");
+			}
+
+			if (!StringUtils.isEmpty(goods.getSupplyCompCd())) {
+				goods.setGoodsCd(goods.getSupplyCompCd());
+			}
+
+			SearchData searchData = new SearchData();
+			searchData.setRegNo(goods.getRegNo());
+			searchData.setSearchCd(goods.getGoodsCd());
+			if (index == 0) {
+				commonService.deleteExceluploadSearCh(searchData);
+			}
+
+			commonService.createExceluploadSearch(searchData);
+			index++;
+		}
+	}
+
+	/**
+	 * 파일 삭제
+	 *
+	 * @param targetPath
+	 * @param excelFilename
+	 * @author eskim
+	 * @since 2020. 10. 22
+	 */
+	private void deleteExceluploadFile(String targetPath, String excelFilename) {
+		// 파일 삭제
+		try {
+			GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, excelFilename));
+		} catch (IOException e) {
+			// Nothing Do
+		}
+	}
+
+	/**
+	 * 상품 품목 변경 저장
+	 *
+	 * @param goodsList
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	@Transactional("shopTxnManager")
+	//@CacheEvict(value = "cate", allEntries = true)
+	public void saveItemKindChange(Collection<Goods> goodsList) {
+		for (Goods goods : goodsList) {
+			goods.setRegNo(TsaSession.getInfo().getUserNo());
+			goods.setUpdNo(TsaSession.getInfo().getUserNo());
+			goods.setItemkindCd(goods.getItemkindCd().toUpperCase());
+			// 품목확인
+			Itemkind itemkind = new Itemkind();
+			itemkind.setItemkindCd(goods.getItemkindCd());
+			itemkind.setUseYn("Y");
+			Collection<Itemkind> itemkindList = goodsDao.getItemkindList(itemkind);
+			if (itemkindList == null || itemkindList.isEmpty()) {
+				throw new IllegalStateException(goods.getGoodsCd() + " 상품의 품목코드를 확인해주세요.");
+			}
+
+			// 상품이력
+			goodsDao.createGoodsHst(goods);
+			// 품목변경
+			goodsDao.updateGoodItemKindCd(goods);
+
+			// 검색어 변경
+			String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
+			Goods tmpGoods = goodsDao.getGoods(goods);
+			if (tmpGoods != null && !StringUtils.isEmpty(tmpGoods.getGoodsSnm1())) {
+				String[] arrGoodsSnm = tmpGoods.getGoodsSnm1().split(";");
+				StringBuilder tempGoodsSnm = new StringBuilder();
+				for (String loopGoodsSnm : arrGoodsSnm) {
+					if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
+						tempGoodsSnm.append(loopGoodsSnm).append(";");
+					}
+				}
+				goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
+
+			} else {
+				goods.setGoodsSnm(goodsSnm);
+			}
+			goodsDao.updateGoodsSnm(goods);
+
+			Collection<GoodsNotiInfo> goodsNotiInfoList = goodsDao.getNewNotiInfo(goods);
+			goodsDao.deleteGoodsNotiInfo(goods);
+
+			for (GoodsNotiInfo goodsNotiInfo : goodsNotiInfoList) {
+				goodsNotiInfo.setRegNo(TsaSession.getInfo().getUserNo());
+				goodsNotiInfo.setUpdNo(TsaSession.getInfo().getUserNo());
+				goodsNotiInfo.setGoodsCd(goods.getGoodsCd());
+				goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
+			}
+
+			this.saveGoodsCategory(goods);
+		}
+	}
+
+	/**
+	 * 상품 품목 기준 카테고리 저장
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 4. 21.
+	 */
+	private void saveGoodsCategory(Goods goods) {
+
+//		GoodsCategory goodsCategory = new GoodsCategory();
+//		goodsCategory.setRegNo(TsaSession.getInfo().getUserNo());
+//		goodsCategory.setUpdNo(TsaSession.getInfo().getUserNo());
+//		goodsCategory.setGoodsCd(goods.getGoodsCd());
+//		displayService.deleteGoodsCategory(goodsCategory);
+//
+//		Collection<ItemkindCategory> itemkindCategoryList = displayService.getItemkindCategoryList(goods.getItemkindCd());
+//		for ItemkindCategory itemkindCategory : itemkindCategoryList) {
+//			Category category = new Category();
+//			category.setCateGb(itemkindCategory.getCateGb());
+//			category.setCateCd(itemkindCategory.getCateCd());
+//			category = displayService.getCategory4srch(category);
+//
+//			CategoryGoods categoryGoods = new CategoryGoods();
+//			categoryGoods.setRegNo(TsaSession.getInfo().getUserNo());
+//			categoryGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+//			String[] goodsCdArr = {goods.getGoodsCd()};
+//			categoryGoods.setGoodsCdArr(goodsCdArr);
+//			if (category.getCateGb() != null) {
+//				categoryGoods.setNcateGb(String.valueOf(category.getCateGb()));
+//			}
+//			if (category.getCateType() != null) {
+//				categoryGoods.setNcateType(String.valueOf(category.getCateType()));
+//			}
+//			if (category.getCateCd() != null) {
+//				categoryGoods.setNcateCd(String.valueOf(category.getCateCd()));
+//			}
+//			if (category.getTcateCd() != null) {
+//				categoryGoods.setNtcateCd(String.valueOf(category.getTcateCd()));
+//			}
+//			if (category.getMcateCd() != null) {
+//				categoryGoods.setNmcateCd(String.valueOf(category.getMcateCd()));
+//			}
+//			if (category.getScateCd() != null) {
+//				categoryGoods.setNscateCd(String.valueOf(category.getScateCd()));
+//			}
+//			if (category.getDcateCd() != null) {
+//				categoryGoods.setNdcateCd(String.valueOf(category.getDcateCd()));
+//			}
+//			displayService.moveCategoryGoods(categoryGoods);
+//		}
+	}
+
+	/**
+	 * 상품 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsDetail(Goods goods) {
+
+		// <,> replace 처리
+		goods.setRegNo(TsaSession.getInfo().getUserNo());
+		goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		goods.setGoodsPcTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcTopDesc(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsMobileTopDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileTopDesc(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsPcDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsPcDownDesc(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsMobileDownDesc(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsMobileDownDesc(), "&lt;", "<"), "&gt;", ">"));
+
+		goods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
+		goods.setGoodsSnm1(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsSnm1(), "&lt;", "<"), "&gt;", ">"));
+
+		// 세트일 경우 상품 가격 확인
+		if ("G056_S".equals(goods.getGoodsType())) {
+
+			Collection<GoodsCompose> goodsExtendList = goods.getGoodsComposeListNew();
+			int currPriceSum = 0;
+			for (GoodsCompose regGoodsExtend : goodsExtendList) {
+				currPriceSum  = currPriceSum + regGoodsExtend.getCompsCurrPrice();
+			}
+
+			if (currPriceSum != goods.getCurrPriceOrg()) {
+				goods.setCurrBprice(goods.getCurrPriceOrg());
+				goods.setCurrPrice(currPriceSum);
+				goods.setDcRate((int)(this.getDcRate(goods.getListPrice() , currPriceSum)));
+			}
+		}else {
+			// 가격변경일
+			if (goods.getCurrPrice() != goods.getCurrPriceOrg()) {
+				goods.setCurrBprice(goods.getCurrPriceOrg());
+			} else {
+				goods.setCurrPrice(goods.getCurrPriceOrg());
+			}
+		}
+
+		// 승인일
+		if (!goods.getGoodsStat().equals(goods.getGoodsStatOrg()) && "G008_90".equals(goods.getGoodsStat())) {
+			goods.setChGoodsStatYn("Y");
+		}
+		// 사용자 검색어를 검색어에 적용
+		String goodsSnm = goodsDao.getGoodsSnm(goods.getGoodsCd());
+		if (!StringUtils.isEmpty(goods.getGoodsSnm1())) {
+			goods.setGoodsSnm1(GagaStringUtil.replace(goods.getGoodsSnm1(), " ", "")); // 빈값 삭제
+			String[] arrGoodsSnm = goods.getGoodsSnm1().split(";");
+			StringBuilder tempGoodsSnm = new StringBuilder();
+			for (String loopGoodsSnm : arrGoodsSnm) {
+				if (goodsSnm.toUpperCase().indexOf(loopGoodsSnm.toUpperCase()) <= -1) {
+					tempGoodsSnm.append(loopGoodsSnm).append(";");
+				}
+			}
+			goods.setGoodsSnm(tempGoodsSnm.toString() + goodsSnm);
+
+		} else if (!goodsSnm.equals(goods.getGoodsSnm())) {
+			goods.setGoodsSnm(goodsSnm);
+		}
+
+		goods.setFormalGb(goods.getFormalGb());
+		// 브랜드 확인
+		if (!"G056_N".equals(goods.getGoodsType())) {
+			if (!goods.getFormalGb().equals(goods.getFormalGbOrg())) {
+				Brand brand = new Brand();
+				brand.setBrandCd(goods.getBrandCd());
+				Collection<Brand> brandList = businessService.getBrandList(brand);
+				if (brandList != null && !brandList.isEmpty()) {
+					float pntPrate = 0.0f;
+					float pntMrate = 0.0f;
+					for (Brand tmpBrand : brandList) {
+						if ("G009_10".equals(goods.getFormalGb())) {
+							pntPrate = tmpBrand.getPntPrate10();
+							pntMrate = tmpBrand.getPntMrate10();
+						} else {
+							pntPrate = tmpBrand.getPntPrate20();
+							pntMrate = tmpBrand.getPntMrate20();
+						}
+					}
+					goods.setPntPrate(pntPrate); // 포인트적립율(PC)
+					goods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+				}
+			}
+		}
+
+		// 기본정보 변경
+		if ("Y".equals(goods.getChDataYn())) {
+			goodsDao.createGoodsHst(goods);
+			goodsDao.updateGoods(goods);
+		}
+
+		// 상품상세정보 변경
+		if (!"Y".equals(goods.getChkDescKeep())) {
+			this.saveGoodsDetailDesc(goods);
+		}
+
+		int idx = 1;
+		// 구성상품 변경
+		if (!"G056_N".equals(goods.getGoodsType())) {
+
+			Collection<GoodsCompose> goodsExtendList = goods.getGoodsComposeListNew();
+			for (GoodsCompose regGoodsExtend : goodsExtendList) {
+				regGoodsExtend.setDispOrd(idx);
+				regGoodsExtend.setRegNo(TsaSession.getInfo().getUserNo());
+				regGoodsExtend.setUpdNo(TsaSession.getInfo().getUserNo());
+				goodsDao.saveGoodsCompose(regGoodsExtend); // 구성상품기본 저장
+
+				idx++;
+			}
+		}
+
+		// 옵션/재고 변경
+		if (goods.getOptCd() != null && goods.getOptCd().length > 0 && "Y".equals(goods.getChStockDataYn())) {
+			this.saveStock(goods);
+		}
+
+		// 상품 정보고시 변경
+		this.saveGoodsNotiInfo(goods);
+
+	}
+
+	/**
+	 * 상품상세정보 변경 - 상품상세
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 27.
+	 */
+	private void saveGoodsDetailDesc(Goods goods) {
+		// 상품상세 구분(10:상품설명, 20:상위컨텐츠, 30:하위컨텐츠, 40:하위컨텐츠-모바일, 50:상위컨텐츠-모바일)
+		GoodsDesc goodsDesc = new GoodsDesc();
+		goodsDesc.setGoodsCd(goods.getGoodsCd());
+		goodsDesc.setRegNo(goods.getRegNo());
+		goodsDesc.setUpdNo(goods.getUpdNo());
+
+		// PC 상단
+		goodsDesc.setDescGb("10");
+		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
+		this.saveGoodsDesc(goodsDesc);
+
+		// PC 하단
+		goodsDesc.setDescGb("20");
+		goodsDesc.setGoodsDesc(goods.getGoodsPcTopDesc());
+		this.saveGoodsDesc(goodsDesc);
+
+		// 공용 하단
+		goodsDesc.setDescGb("30");
+		goodsDesc.setGoodsDesc(goods.getGoodsPcDownDesc());
+		this.saveGoodsDesc(goodsDesc);
+
+		// MO 상단
+		goodsDesc.setDescGb("40");
+		goodsDesc.setGoodsDesc(goods.getGoodsMobileTopDesc());
+		this.saveGoodsDesc(goodsDesc);
+
+		//		// 상품상세 저장
+
+		//
+		//		// 세트상품의 구서상품으로 있을경우 처리
+		//		this.saveGoodsSetDesc(goodsDesc);
+
+		// MO 하단
+		goodsDesc.setDescGb("50");
+		goodsDesc.setGoodsDesc(goods.getGoodsMobileDownDesc());
+		this.saveGoodsDesc(goodsDesc);
+	}
+
+	/**
+	 * 상품 상세 저장
+	 *
+	 * @param goodsDesc
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	private void saveGoodsDesc(GoodsDesc goodsDesc) {
+
+		goodsDao.deleteGoodsDesc(goodsDesc);
+
+		String[] arrProdHtml = null;
+		arrProdHtml = makeArrayToString(goodsDesc.getGoodsDesc(), 3800);
+		if (arrProdHtml.length > 0) {
+			for (int i = 0; i < arrProdHtml.length; i++) {
+				if (!arrProdHtml[i].isEmpty()) {
+					goodsDesc.setSeq(i + 1);
+					goodsDesc.setGoodsDesc(arrProdHtml[i]);
+					goodsDao.createGoodsDesc(goodsDesc);
+				}
+			}
+		}
+	}
+
+	/**
+	 * String => byte array
+	 *
+	 * @param raw
+	 * @param len
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	public static String[] makeArrayToString(String raw, int len) {
+
+		String[] ary = null;
+
+		if (raw == null) {
+			return ary;
+		}
+
+		try {
+
+			// raw 의 byte
+			byte[] rawBytes = raw.getBytes("UTF-8"); // MS949
+			int rawLength = rawBytes.length;
+
+			if (rawLength > len) {
+				int aryLength = (rawLength / len) + (rawLength % len != 0 ? 1 : 0);
+				ary = new String[aryLength];
+
+				int endCharIndex = 0; // 문자열이 끝나는 위치
+				String tmp;
+				for (int i = 0; i < aryLength; i++) {
+
+					if (i == (aryLength - 1)) {
+						tmp = raw.substring(endCharIndex);
+					} else {
+
+						int useByteLength = 0;
+						int rSize = 0;
+						for (; endCharIndex < raw.length(); endCharIndex++) {
+
+							if (raw.charAt(endCharIndex) > 0x007F) {
+								useByteLength += 3;
+							} else {
+								useByteLength++;
+							}
+							if (useByteLength > len) {
+								break;
+							}
+							rSize++;
+						}
+						tmp = raw.substring((endCharIndex - rSize), endCharIndex);
+					}
+
+					ary[i] = tmp;
+				}
+
+			} else {
+				ary = new String[] {raw};
+			}
+
+		} catch (java.io.UnsupportedEncodingException e) {
+		}
+
+		return ary;
+	}
+
+	/**
+	 * 옵션/재고 변경 - 상품상세
+	 *
+	 * @param goods
+	 * @param index
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	private void saveStock(Goods goods) {
+		int index = 0;
+		Option stock = new Option();
+		stock.setGoodsCd(goods.getGoodsCd());
+		stock.setUpdNo(goods.getUpdNo());
+		stock.setRegNo(goods.getRegNo());
+		goodsDao.createStockHst(stock);
+
+		for (String optCd : goods.getOptCd()) {
+			Option goodsStock = new Option();
+			goodsStock.setGoodsCd(goods.getCompsGoodsCd()[index]); // 구성상품 코드
+			goodsStock.setOptCd(optCd);
+			goodsStock.setOptNm1(goods.getOptNm1()[index]);
+			goodsStock.setOptNm2(goods.getOptNm2()[index]);
+			goodsStock.setBaseStockQty(Integer.parseInt(goods.getBaseStockQty()[index]));
+			goodsStock.setSoldoutYn(goods.getSoldoutYn()[index]);
+			goodsStock.setDispOrd(goods.getDispOrd()[index]);
+			goodsStock.setDispYn(goods.getDispYn()[index]);
+			goodsStock.setRegNo(goods.getRegNo());
+			goodsStock.setUpdNo(goods.getUpdNo());
+
+			if ("N".equals(goods.getSelfGoodsYn())) {
+				goodsStock.setSelfGoodsYn(goods.getSelfGoodsYn());
+				goodsStock.setCurrStockQty(Integer.parseInt(goods.getEditCurrStockQty()[index]));
+			}
+			goodsDao.saveStock(goodsStock);
+			index++;
+		}
+	}
+
+	/**
+	 * 상품 정보고시 변경 - 상품상세
+	 *
+	 * @param goods
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	private void saveGoodsNotiInfo(Goods goods) {
+		int index;
+		if (goods.getNotiListNew() != null && !goods.getNotiListNew().isEmpty()) {
+			index = 0;
+			for (GoodsNotiInfo goodsNotiInfo : goods.getNotiListNew()) {
+				if (index == 0) {
+					goodsDao.deleteGoodsNotiInfo(goods);
+				}
+				goodsNotiInfo.setNiContent(GagaStringUtil.replace(GagaStringUtil.replace(goodsNotiInfo.getNiContent(), "&lt;", "<"), "&gt;", ">"));
+				goodsNotiInfo.setRegNo(goods.getRegNo());
+				goodsNotiInfo.setUpdNo(goods.getUpdNo());
+				goodsDao.saveGoodsNotiInfo(goodsNotiInfo);
+				index++;
+			}
+		}
+	}
+
+	/**
+	 * 딜상품 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsDeal(Goods goods) {
+
+		Goods regGoods = new Goods();
+
+		// <,> replace 처리
+		regGoods.setRegNo(TsaSession.getInfo().getUserNo());
+		regGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		String goodsCd = this.getGoodsCodeSeq("D", "D");
+		regGoods.setGoodsCd(goodsCd);
+		regGoods.setSupplyGoodsCd(goodsCd);
+		regGoods.setGoodsType("G056_D");
+		regGoods.setSupplyCompCd(goods.getSupplyCompCd());
+		regGoods.setBrandCd(goods.getBrandCd());
+		regGoods.setItemkindCd(goods.getItemkindCd());
+		regGoods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
+		regGoods.setStyleYear(goods.getStyleYear());
+		regGoods.setSeasonCd(goods.getSeasonCd());
+		regGoods.setSexGb(goods.getSexGb());
+		regGoods.setColorCd(goods.getColorCd());
+		regGoods.setMainColorYn("Y");
+		regGoods.setMakeNm(goods.getMakeNm());
+		regGoods.setMakeYmd(goods.getMakeYmd());
+		regGoods.setSelfMallYn(goods.getSelfMallYn());
+		regGoods.setGoodsStat("G008_20"); // 정보부족
+		regGoods.setFormalGb("G009_10"); // 정상 기본값 처리
+		regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
+		regGoods.setDistributionGb("G065_12"); // 유통구분
+		regGoods.setGoodsNum(goodsCd);
+
+		regGoods.setListPrice(goods.getCurrPrice());
+		regGoods.setCurrPrice(goods.getCurrPrice());
+		regGoods.setDcRate((int)(this.getDcRate(goods.getCurrPrice(), goods.getCurrPrice())));
+
+		Collection<GoodsCompose> goodsComposeList = null;
+		try {
+			goodsComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
+			});
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new IllegalStateException(message.getMessage("딜상품 저장 중 오류로 인해 저장되지 않았습니다."));
+		}
+
+		for (GoodsCompose goodsCompose : goodsComposeList) {
+			goodsCompose.setGoodsCd(regGoods.getGoodsCd());
+			goodsCompose.setGoodsType(regGoods.getGoodsType());
+			goodsCompose.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsCompose.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			Goods extendGoods = new Goods();
+			extendGoods.setGoodsCd(goodsCompose.getCompsGoodsCd());
+			extendGoods = goodsDao.getGoods(extendGoods);
+			if (StringUtils.isEmpty(extendGoods.getBrandCd())) {
+				throw new IllegalStateException(message.getMessage("구성상품 중 " + goodsCompose.getCompsGoodsCd() + " 상품 정보를 확인해 주세요."));
+			}
+
+			if ("Y".equals(goodsCompose.getBaseYn())) {
+				regGoods.setBrandCd(extendGoods.getBrandCd());
+				regGoods.setItemkindCd(extendGoods.getItemkindCd());
+				regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
+				regGoods.setFormalGb(extendGoods.getFormalGb());
+			}
+		}
+
+		this.createGoodsExtend(regGoods, goodsComposeList); // 딜상품 관련 정보 저장
+	}
+
+	/**
+	 * 세트상품 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 04
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsSet(Goods goods) {
+
+		Goods regGoods = new Goods();
+
+		// <,> replace 처리
+		regGoods.setRegNo(TsaSession.getInfo().getUserNo());
+		regGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		String goodsCd = this.getGoodsCodeSeq("S", "S");
+		regGoods.setGoodsCd(goodsCd);
+		regGoods.setSupplyGoodsCd(goodsCd);
+		regGoods.setGoodsType("G056_S");
+		regGoods.setSupplyCompCd(goods.getSupplyCompCd());
+		regGoods.setBrandCd(goods.getBrandCd());
+		regGoods.setItemkindCd(goods.getItemkindCd());
+		regGoods.setGoodsNm(GagaStringUtil.replace(GagaStringUtil.replace(goods.getGoodsNm(), "&lt;", "<"), "&gt;", ">"));
+		regGoods.setStyleYear(goods.getStyleYear());
+		regGoods.setSeasonCd(goods.getSeasonCd());
+		regGoods.setSexGb(goods.getSexGb());
+		regGoods.setColorCd(goods.getColorCd());
+		regGoods.setMainColorYn("Y");
+		regGoods.setMakeNm(goods.getMakeNm());
+		regGoods.setMakeYmd(goods.getMakeYmd());
+		regGoods.setSelfMallYn(goods.getSelfMallYn());
+		regGoods.setGoodsStat("G008_20"); // 정보부족
+		regGoods.setFormalGb("G009_10"); // 정상 기본값 처리
+		regGoods.setGoodsGb("G073_11"); // 자사상품은 신규
+		regGoods.setDistributionGb("G065_12"); // 유통구분
+		regGoods.setGoodsNum(goodsCd);
+
+		Collection<GoodsCompose> goodsComposeList = null;
+		try {
+			goodsComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
+			});
+		} catch (Exception e) {
+			throw new IllegalStateException(message.getMessage("세트상품 저장 중 오류로 인해 저장되지 않았습니다."));
+		}
+
+		int listPriceSum = 0;
+		int currPriceSum = 0;
+		for (GoodsCompose goodsCompose : goodsComposeList) {
+			goodsCompose.setGoodsCd(regGoods.getGoodsCd());
+			goodsCompose.setGoodsType(regGoods.getGoodsType());
+			goodsCompose.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsCompose.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			Goods extendGoods = new Goods();
+			extendGoods.setGoodsCd(goodsCompose.getCompsGoodsCd());
+			extendGoods = goodsDao.getGoods(extendGoods);
+			if (StringUtils.isEmpty(extendGoods.getBrandCd())) {
+				throw new IllegalStateException(message.getMessage("구성상품 중 " + goodsCompose.getCompsGoodsCd() + " 상품 정보를 확인해 주세요."));
+			}
+			listPriceSum += extendGoods.getListPrice();
+			currPriceSum += goodsCompose.getCompsCurrPrice(); // 입력값
+
+			if ("Y".equals(goodsCompose.getBaseYn())) {
+				regGoods.setBrandCd(extendGoods.getBrandCd());
+				regGoods.setItemkindCd(extendGoods.getItemkindCd());
+				regGoods.setGoodsNum(extendGoods.getGoodsNum());
+				regGoods.setSupplyCompCd(extendGoods.getSupplyCompCd());
+				regGoods.setFormalGb(extendGoods.getFormalGb());
+			}
+		}
+
+		regGoods.setListPrice(listPriceSum);
+		regGoods.setCurrPrice(currPriceSum);
+		regGoods.setDcRate((int)(this.getDcRate(listPriceSum, currPriceSum)));
+
+		this.createGoodsExtend(regGoods, goodsComposeList); // 세트상품 관련 정보 저장
+	}
+
+	/**
+	 * 세트/딜 상품 관련 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	private void createGoodsExtend(Goods regGoods, Collection<GoodsCompose> goodsComposeList) {
+		// 브랜드 확인
+		Brand brand = new Brand();
+		brand.setBrandCd(regGoods.getBrandCd());
+		brand.setSupplyCompCd(regGoods.getSupplyCompCd());
+		Collection<Brand> brandList = businessService.getBrandList(brand);
+		if (brandList == null || brandList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("구성상품 중 기준 상품의 브랜드를 확인해 주세요."));
+		}
+
+		int delvFee = 0;
+		int minOrdAmt = 0;
+		float pntPrate = 0.0f;
+		float pntMrate = 0.0f;
+		float sellFeeRate = 0.0f;
+		for (Brand tmpBrand : brandList) {
+
+			delvFee = tmpBrand.getDelvFee();
+			minOrdAmt = tmpBrand.getMinOrdAmt();
+			if ("10".equals(regGoods.getFormalGb())) {
+				pntPrate = tmpBrand.getPntPrate10();
+				pntMrate = tmpBrand.getPntMrate10();
+			} else {
+				pntPrate = tmpBrand.getPntPrate20();
+				pntMrate = tmpBrand.getPntMrate20();
+			}
+			sellFeeRate = tmpBrand.getSellFeeRate();
+		}
+		regGoods.setDelvFee(delvFee); // 배송비
+		regGoods.setMinOrdAmt(minOrdAmt); // 무료배송비최소구매금액
+		regGoods.setPntPrate(pntPrate); // 포인트적립율(PC)
+		regGoods.setPntMrate(pntMrate); // 포인트적립율(MOBILE)
+		regGoods.setSellFeeRate(sellFeeRate); // 판매수수료율
+		regGoods.setSelfGoodsYn("Y");
+
+		// 스타일 연도
+		regGoods.setStyleYear(regGoods.getStyleYear());
+
+		goodsDao.createGoods(regGoods); // 상품기본 저장
+		goodsDao.createGoodsSmmary(regGoods); // 상품통계 생성
+
+		StringBuilder goodsDescSb = new StringBuilder(); // 상품상세
+
+		int dispOrd = 1;
+		for (GoodsCompose regGoodsExtend : goodsComposeList) {
+			regGoodsExtend.setDispOrd(dispOrd);
+			goodsDao.saveGoodsCompose(regGoodsExtend); // 구성상품기본 저장
+			dispOrd++;
+		}
+
+		// 사용자 검색어를 검색어에 적용
+		String goodsSnm = goodsDao.getGoodsSnm(regGoods.getGoodsCd());
+		regGoods.setGoodsSnm(goodsSnm);
+		goodsDao.updateGoodsSnm(regGoods);
+		// 카테고리 전시
+		// 추후 작업 해야함 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+		//goodsDao.createCategoryGoods(regGoods);
+
+		// 추후 작업 해야함 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+		// 대표 이미지만 생성
+//		GoodsImg goodsImg = new GoodsImg();
+//		goodsImg.setGoodsCd(regGoods.getGoodsCd());
+//		goodsImg.setImgType("A");
+//		// 이미지 경로 확인하자!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+//		goodsImg.setImgPath1(this.getGoodsImgPath(regGoods.getGoodsCd(), regGoods.getBrandCd()) + "01.jpg");
+//		goodsImg.setRegNo(TsaSession.getInfo().getUserNo());
+//		goodsImg.setUpdNo(TsaSession.getInfo().getUserNo());
+//		goodsDao.saveGoodsImgInfo(goodsImg);
+	}
+
+	/**
+	 * 품 이미지 경로생성
+	 *
+	 * @param goodsCd
+	 * @param brandCd
+	 * @return String
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	private String getGoodsImgPath(String goodsCd, String brandCd) {
+		return "/" + goodsCd.substring(0, 1) + "/" + goodsCd.substring(0, 3) + "/" + goodsCd + "/1000/" + goodsCd + "_";
+	}
+
+	/**
+	 * 상품 코드 생성
+	 *
+	 * @param goodsType - 상품타입
+	 * @param goodsCdAfter - 상품시퀀스 앞에 붙는명
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	public String getGoodsCodeSeq(String goodsType, String goodsCdAfter) {
+
+		//상품코드 12자리
+		String goodsCd = "";
+		Goods goods = new Goods();
+		goodsDao.createGoodsSequence(goods);
+		String goodsSeq = GagaStringUtil.getLPadding(Integer.toString(goods.getGoodsSq()), 9, "0");
+		if ("S".equals(goodsType) || "D".equals(goodsType)) {
+			goodsCd = SELF_GOOODS_AFTER + goodsCdAfter + goodsSeq;
+
+		} else {
+			goodsCd = goodsCdAfter + goodsSeq; // 입점 : 브랜드코드
+		}
+		return goodsCd;
+	}
+
+	/**
+	 * 상품 타이틀 관리 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11 .02
+	 */
+	public int getGoodsTitleReserveCount(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsTitleReserveCount(goodsSearch);
+	}
+
+	/**
+	 * 상품 타이틀 관리 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11 .02
+	 */
+	public Collection<GoodsTnmRes> getGoodsTitleReserveList(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsTitleReserveList(goodsSearch);
+	}
+
+	/**
+	 * 상품 타이틀 예약 등록
+	 *
+	 * @param goodsTnmRes
+	 * @author eskim
+	 * @since 2020. 11 .02
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsRsvtTnm(GoodsTnmRes goodsTnmRes) {
+		if (goodsTnmRes.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		goodsTnmRes.setGoodsTnm(GagaStringUtil.replace(GagaStringUtil.replace(goodsTnmRes.getGoodsTnm(), "&lt;", "<"), "&gt;", ">"));
+
+		for (String goodsCd : goodsTnmRes.getArrGoodsCd()) {
+
+			goodsTnmRes.setGoodsCd(goodsCd);
+			goodsTnmRes.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsTnmRes.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			if (goodsDao.getGoodsTnmDupChkCount(goodsTnmRes) > 0) {
+				throw new IllegalStateException("이미 등록된 상품 타이틀예약이 등록하려는 예약기간내에 존재합니다. \n(상품코드 : " + goodsCd + ")");
+			}
+
+			goodsDao.createGoodTnmRes(goodsTnmRes);
+
+			// 현재일자가 예약기간에 포함되어 있으면 바로 적용한다.
+			String toDaytime = GagaDateUtil.getTodayDateTime();
+			if (Long.parseLong(toDaytime) >= Long.parseLong(goodsTnmRes.getApplyStdt()) && Long.parseLong(toDaytime) <= Long.parseLong(goodsTnmRes.getApplyEddt())) {
+
+				// 이력생성 및 상품타이틀 수정
+				Goods goods = new Goods();
+				goods.setGoodsCd(goodsCd);
+				goods.setGoodsTnm(goodsTnmRes.getGoodsTnm());
+				goods.setRegNo(TsaSession.getInfo().getUserNo());
+				goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+				goodsDao.createGoodsHst(goods);
+				goodsDao.updateGoodTnm(goods);
+			}
+
+		}
+	}
+
+	/**
+	 * 상품 타이틀 예약 삭제
+	 *
+	 * @param goodsTnmRes
+	 * @author eskim
+	 * @since 2020. 11 .02
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteGoodsRsvtTnm(GoodsTnmRes goodsTnmRes) {
+		if (goodsTnmRes.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		int idx = 0;
+		for (String goodsCd : goodsTnmRes.getArrGoodsCd()) {
+
+			// 상품 타이틀 예약 삭제
+			goodsTnmRes.setGoodsTnmResSq(goodsTnmRes.getArrGoodsTnmResSq()[idx]);
+			goodsDao.deleteGoodTnmRes(goodsTnmRes);
+
+			// 상품 타이틀 예약건 초기화
+			Goods goods = new Goods();
+			goods.setGoodsCd(goodsCd);
+			goods = goodsDao.getGoodTnmInit(goods);
+			goods.setRegNo(TsaSession.getInfo().getUserNo());
+			goods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			if (!StringUtils.isEmpty(goods.getGoodsTnm()) && !goods.getGoodsTnm().equals(goods.getGoodTnmInit())) {
+
+				// 상품이력 먼저 쌓기
+				goodsDao.createGoodsHst(goods);
+				// 정보수정
+				goods.setGoodsTnm(goods.getGoodTnmInit());
+				goodsDao.updateGoodTnm(goods);
+
+			}
+			idx++;
+		}
+	}
+
+	/**
+	 * 네이버 EP 제외 상품 목록 건수
+	 *
+	 * @param goodsSearch
+	 * @return int
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	public int getGoodsEpSkipCount(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsEpSkipCount(goodsSearch);
+	}
+
+	/**
+	 * 네이버 EP 제외 상품 목록
+	 *
+	 * @param goodsSearch
+	 * @return Collection<TsaGoodsEpSkip>
+	 * @author daehyoung
+	 * @since 2020. 11. 03
+	 */
+	public Collection<GoodsEpSkip> getGoodsEpSkipList(GoodsSearch goodsSearch) {
+		return goodsDao.getGoodsEpSkipList(goodsSearch);
+	}
+
+	/**
+	 * 네이버 EP 제외 상품 예약 등록
+	 *
+	 * @param goodsEpSkip
+	 * @return void
+	 * @author daehyoung
+	 * @since 2020. 11. 03
+	 */
+	@Transactional("shopTxnManager")
+	public void saveGoodsRsvtEpSkip(GoodsEpSkip goodsEpSkip) {
+		if (goodsEpSkip.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		for (String goodsCd : goodsEpSkip.getArrGoodsCd()) {
+
+			goodsEpSkip.setGoodsCd(goodsCd);
+			goodsEpSkip.setRegNo(TsaSession.getInfo().getUserNo());
+			goodsEpSkip.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			if (goodsDao.getGoodsEpSkipDupChkCount(goodsEpSkip) > 0) {
+				throw new IllegalStateException("비노출예약이 중복된 상품이 존재합니다.<br/>(상품코드 : " + goodsCd + ")");
+			}
+			goodsDao.createGoodEpSkip(goodsEpSkip);
+		}
+	}
+
+	/**
+	 * 네이버 EP 제외 상품 예약 삭제
+	 *
+	 * @param goodsEpSkip
+	 * @return void
+	 * @author daehyoung
+	 * @since 2020. 11. 03
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteGoodsEpSkip(GoodsEpSkip goodsEpSkip) {
+		if (goodsEpSkip.getArrGoodsCd().length <= 0) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+		int idx = 0;
+		for (String goodsCd : goodsEpSkip.getArrGoodsCd()) {
+			goodsEpSkip.setGoodsEpSkipSq(goodsEpSkip.getArrGoodsEpSkipSq()[idx]);
+			goodsDao.deleteGoodEpSkip(goodsEpSkip);
+			idx++;
+		}
+	}
+
+	/**
+	 * 상품 상세공지 목록
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 05
+	 */
+	public Collection<Notice> getNoticeList(GoodsSearch goodsSearch) {
+		return goodsDao.getNoticeList(goodsSearch);
+	}
+
+	/**
+	 * 상품 상세공지 상품 목록
+	 *
+	 * @param notice
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 06
+	 */
+	public Collection<NoticeGoods> getNoticeGoodsList(Notice notice) {
+		return goodsDao.getNoticeGoodsList(notice);
+	}
+
+	/**
+	 * 공지사항 저장
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 05
+	 */
+	@Transactional("shopTxnManager")
+	public void saveNotice(Notice notice) {
+		notice.setRegNo(TsaSession.getInfo().getUserNo());
+		notice.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		// 신규 일때
+		if (notice.getNoticeSq() == null) {
+			// 공지사항 저장
+			noticeService.createNotice(notice);
+
+			// 등록된 사용자번호 값 가져오기
+			Integer noticeSq = notice.getNoticeSq();
+
+			notice.setNoticeSq(noticeSq);
+
+		} else {
+			// 공지사항 수정
+			noticeService.updateNotice(notice);
+		}
+
+		if (!StringUtils.isEmpty(notice.getGoodsList())) {
+			Collection<NoticeGoods> noticeGoodsList = null;
+			try {
+				noticeGoodsList = mapper.readValue(notice.getGoodsList(), new TypeReference<Collection<NoticeGoods>>() {
+				});
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException(message.getMessage("상품상세공지 저장 중 오류로 인해 저장되지 않았습니다."));
+			}
+			log.info("noticeGoodsList: {}", noticeGoodsList);
+			for (NoticeGoods noticeGoods : noticeGoodsList) {
+				noticeGoods.setNoticeSq(notice.getNoticeSq());
+				noticeGoods.setRegNo(TsaSession.getInfo().getUserNo());
+				noticeGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+
+				goodsDao.saveNoticeGoods(noticeGoods);
+			}
+
+		}
+	}
+
+	/**
+	 * 공지사항 상품 삭제
+	 * @param noticeGoods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 06
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteNoticeGoods(NoticeGoods noticeGoods) {
+		goodsDao.deleteNoticeGoods(noticeGoods);
+	}
+}

+ 234 - 234
style24.admin/src/main/java/com/style24/admin/biz/service/TsaKakaoService.java

@@ -1,234 +1,234 @@
-package com.style24.admin.biz.service;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.style24.core.biz.thirdparty.SsgKakaoSender;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 카카오알림톡 Service. 모든 카카오알림톡 발송은 여기에서 처리한다.
- *
- * @author gagamel
- * @since 2020. 11. 9
- */
-@Service
-@Slf4j
-public class TsaKakaoService {
-
-	@Autowired
-	private SsgKakaoSender kakaoSender;
-
-//	/**
-//	 * 고객 임시비밀번호 알림톡 발송
-//	 * @param counsel - 상담 정보
-//	 * @author gagamel
-//	 * @since 2020. 11. 9
-//	 */
-//	@Transactional("shopTxnManager")
-//	public void sendCustomerTempPassword(AdmCustomer customer) {
-//		SsgDirectMessage dm = new SsgDirectMessage();
-//		dm.setFuserid(String.valueOf(TsaSession.getInfo().getUserNo())); // 발송자ID
-//		dm.setFdestine(customer.getCellPhnno());
-//		dm.setFkkoresendtype("LMS");
-//
-//		GagaMap replaceInfo = new GagaMap();
-//		replaceInfo.setString("siteNm", customer.getSiteNm());
-//		replaceInfo.setString("custNm", customer.getCustNm());
-//		replaceInfo.setString("passwd", customer.getPasswd());
-//
-//		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.TempPasswd.value(), dm, replaceInfo);
-//
-//		try {
-//			// 고객접촉이력 정보
-//			customer.setContactType("203"); // 접촉유형:임시비밀번호발급(공통코드G054)
-//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
-//			customer.setContactContents("고객 임시비밀번호 발송");
-//			customer.setReceiverId(customer.getCustNo());
-//			customerService.createCustomerContactHistory(customer);
-//		} catch (Exception e) {
-//			log.error("error", e);
-//			// Do nothing
-//		}
-//	}
-//
-//	/**
-//	 * 일대일문의 답변 알림톡 발송
-//	 * @param counsel - 상담 정보
-//	 * @author gagamel
-//	 * @since 2020. 4. 6
-//	 */
-//	@Transactional("shopTxnManager")
-//	public void sendOnetoOneAnswer(AdmCounsel counsel) {
-//		SsgDirectMessage dm = new SsgDirectMessage();
-//		dm.setFdestine(counsel.getCellPhnno());
-//		dm.setFkkoresendtype("LMS");
-//		dm.setButtonNm("마이페이지 > 1:1문의");
-//		dm.setButtonUrl("/mypage/counsel/detail/form/" + counsel.getCounselSq());
-//
-//		GagaMap replaceInfo = new GagaMap();
-//		replaceInfo.setString("siteNm", systemService.getSiteName(AdmConstants.SITE_CD));
-//		replaceInfo.setString("custNm", counsel.getCustNm());
-//
-//		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.OtoAnswer.value(), dm, replaceInfo);
-//
-//		try {
-//			// 고객접촉이력 정보
-//			AdmCustomer customer = new AdmCustomer();
-//			customer.setContactType("204"); // 접촉유형:1:1문의답변(공통코드G054)
-//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
-//			customer.setContactContents("1:1 문의 답변 발송");
-//			customer.setReceiverId(counsel.getCustNo());
-//			customerService.createCustomerContactHistory(customer);
-//		} catch (Exception e) {
-//			log.error("error", e);
-//			// Do nothing
-//		}
-//	}
-//
-//	/**
-//	 * 인증번호발송
-//	 * @param customer - 인증번호 발송
-//	 * @author jsshin
-//	 * @since 2020. 4. 8
-//	 */
-//	public void sendCustomerCertNo(AdmCustomer customer) {
-//		SsgDirectMessage dm = new SsgDirectMessage();
-//		dm.setFdestine(customer.getCellPhnno());
-//		dm.setFkkoresendtype("LMS");
-//
-//		GagaMap replaceInfo = new GagaMap();
-//		replaceInfo.setString("siteNm", customer.getSiteNm());
-//		replaceInfo.setString("custNm", customer.getCustNm());
-//		replaceInfo.setString("certNo", customer.getCertNo());
-//
-//		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.CertNoSend.value(), dm, replaceInfo);
-//
-//		try {
-//			// 고객접촉이력 정보
-//			customer.setContactType("209"); // 접촉유형:1:1문의답변(공통코드G054)
-//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
-//			customer.setContactContents("인증번호");
-//			customer.setReceiverId(customer.getCustNo());
-//			customerService.createCustomerContactHistory(customer);
-//		} catch (Exception e) {
-//			log.error("error", e);
-//			// Do nothing
-//		}
-//	}
-//
-//	/**
-//	 * 품절에의한 주문취소 안내
-//	 * @param delivery
-//	 * @author yujung
-//	 * @since 2020. 4. 23
-//	 */
-//	public void sendCancelBySoldout(String payMeans, AdmDelivery delivery) {
-//		SsgDirectMessage dm = new SsgDirectMessage();
-//		dm.setFdestine(delivery.getOrderPhnno());
-//		dm.setFkkoresendtype("LMS");
-//
-//		GagaMap replaceInfo = new GagaMap();
-//		replaceInfo.setString("siteNm", systemService.getSiteName(AdmConstants.SITE_CD));
-//		replaceInfo.setString("custNm", delivery.getOrderNm());
-//		replaceInfo.setString("goodsNm", delivery.getGoodsNm());
-//		replaceInfo.setString("callcenterTelNo", TscConstants.CALLCENTER_TEL_NO);
-//
-//		Integer KakaoAnswerSq = null;
-//		if (payMeans.equals(TscConstants.PayMeans.CREDIT_CARD.value())) { // 신용카드
-//			KakaoAnswerSq = SsgKakaoSender.KakaoAnswerSq.CardCancelBySoldout.value();
-//		} else if (payMeans.equals(TscConstants.PayMeans.ACCOUNT_TRANSFER.value())) { // 실시간계좌이체
-//			KakaoAnswerSq = SsgKakaoSender.KakaoAnswerSq.AtCancelBySoldout.value();
-//		} else if (payMeans.equals(TscConstants.PayMeans.BANK_DEPOSIT.value())) { // 무통장입금
-//			KakaoAnswerSq = SsgKakaoSender.KakaoAnswerSq.VaCancelBySoldout.value();
-//		}
-//
-//		kakaoSender.send(KakaoAnswerSq, dm, replaceInfo);
-//
-//		try {
-//			// 고객접촉이력 정보
-//			AdmCustomer customer = new AdmCustomer();
-//			customer.setContactType("304"); // 접촉유형 : 주문-품절안내(공통코드G054)
-//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법 : 알림톡+문자(공통코드G055)
-//			customer.setContactContents("품절에의한 주문취소 안내");
-//			customer.setReceiverId(delivery.getCustNo());
-//			customerService.createCustomerContactHistory(customer);
-//		} catch (Exception e) {
-//			log.error("error", e);
-//			// Do nothing
-//		}
-//	}
-//
-//	/**
-//	 * 주문취소안내 알림톡
-//	 * @param customer - 고객 정보
-//	 * @author gagamel
-//	 * @since 2020. 11. 9
-//	 */
-//	@Transactional("shopTxnManager")
-//	public void sendOrderCancel(AdmCustomer customer, AdmOrder order) {
-//		SsgDirectMessage dm = new SsgDirectMessage();
-//		dm.setFdestine(customer.getCellPhnno());
-//		dm.setFkkoresendtype("LMS");
-//
-//		dm.setButtonNm("마이페이지 > 주문내역");
-//		dm.setButtonUrl("/mypage/order/list/form");
-//
-//		GagaMap replaceInfo = new GagaMap();
-//		replaceInfo.setString("siteNm", systemService.getSiteName(AdmConstants.SITE_CD));
-//		replaceInfo.setString("custNm", customer.getCustNm());
-//
-//		if (order.getPayMeans().equals(TscConstants.PayMeans.CREDIT_CARD.value())) { // 신용카드
-//			kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.CardCancelRefund.value(), dm, replaceInfo);
-//		} else if (order.getPayMeans().equals(TscConstants.PayMeans.ACCOUNT_TRANSFER.value())) { // 실시간계좌이체
-//			kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.AtCancelRefund.value(), dm, replaceInfo);
-//		} else if (order.getPayMeans().equals(TscConstants.PayMeans.BANK_DEPOSIT.value())) { // 무통장입금
-//			kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.VaCancelRefund.value(), dm, replaceInfo);
-//		}
-//
-//		try {
-//			// 고객접촉이력 정보
-//			customer.setContactType("305"); // 접촉유형:주문안내(공통코드G054)
-//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
-//			customer.setContactContents("주문-취소안내");
-//			customer.setReceiverId(customer.getCustNo());
-//			customerService.createCustomerContactHistory(customer);
-//		} catch (Exception e) {
-//			log.error("error", e);
-//			// Do nothing
-//		}
-//	}
-//
-//	/**
-//	 * 기본 LMS 발송
-//	 * @param customer - LMS 정보
-//	 * @author gagamel
-//	 * @since 2020. 11. 9
-//	 */
-//	@Transactional("shopTxnManager")
-//	public void sendCustomerBasicLms(AdmCustomer customer) {
-//		SsgDirectMessage dm = new SsgDirectMessage();
-//		dm.setFdestine(customer.getCellPhnno());
-//
-//		GagaMap replaceInfo = new GagaMap();
-//		replaceInfo.setString("siteNm", customer.getSiteNm());
-//		replaceInfo.setString("custNm", customer.getCustNm());
-//		replaceInfo.setString("content", customer.getContent());
-//		replaceInfo.setString("callcenterTelNo", TscConstants.CALLCENTER_TEL_NO);
-//		kakaoSender.sendLms(SsgKakaoSender.KakaoAnswerSq.BasicLms.value(), dm, replaceInfo);
-//
-//		try {
-//			// 고객접촉이력 정보
-//			customer.setContactType("207"); // 접촉유형:회원-기본LMS안내발송
-//			customer.setContactMethod(TscConstants.ContactMethod.LMS.value()); // 접촉방법:LMS(공통코드G055)
-//			customer.setContactContents("기본LMS안내발송");
-//			customer.setReceiverId(customer.getCustNo());
-//			customerService.createCustomerContactHistory(customer);
-//		} catch (Exception e) {
-//			log.error("error", e);
-//			// Do nothing
-//		}
-//	}
-
-}
+package com.style24.admin.biz.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.core.biz.thirdparty.SsgKakaoSender;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 카카오알림톡 Service. 모든 카카오알림톡 발송은 여기에서 처리한다.
+ *
+ * @author gagamel
+ * @since 2020. 11. 9
+ */
+@Service
+@Slf4j
+public class TsaKakaoService {
+
+	@Autowired
+	private SsgKakaoSender kakaoSender;
+
+//	/**
+//	 * 고객 임시비밀번호 알림톡 발송
+//	 * @param counsel - 상담 정보
+//	 * @author gagamel
+//	 * @since 2020. 11. 9
+//	 */
+//	@Transactional("shopTxnManager")
+//	public void sendCustomerTempPassword(AdmCustomer customer) {
+//		SsgDirectMessage dm = new SsgDirectMessage();
+//		dm.setFuserid(String.valueOf(TsaSession.getInfo().getUserNo())); // 발송자ID
+//		dm.setFdestine(customer.getCellPhnno());
+//		dm.setFkkoresendtype("LMS");
+//
+//		GagaMap replaceInfo = new GagaMap();
+//		replaceInfo.setString("siteNm", customer.getSiteNm());
+//		replaceInfo.setString("custNm", customer.getCustNm());
+//		replaceInfo.setString("passwd", customer.getPasswd());
+//
+//		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.TempPasswd.value(), dm, replaceInfo);
+//
+//		try {
+//			// 고객접촉이력 정보
+//			customer.setContactType("203"); // 접촉유형:임시비밀번호발급(공통코드G054)
+//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
+//			customer.setContactContents("고객 임시비밀번호 발송");
+//			customer.setReceiverId(customer.getCustNo());
+//			customerService.createCustomerContactHistory(customer);
+//		} catch (Exception e) {
+//			log.error("error", e);
+//			// Do nothing
+//		}
+//	}
+//
+//	/**
+//	 * 일대일문의 답변 알림톡 발송
+//	 * @param counsel - 상담 정보
+//	 * @author gagamel
+//	 * @since 2020. 4. 6
+//	 */
+//	@Transactional("shopTxnManager")
+//	public void sendOnetoOneAnswer(AdmCounsel counsel) {
+//		SsgDirectMessage dm = new SsgDirectMessage();
+//		dm.setFdestine(counsel.getCellPhnno());
+//		dm.setFkkoresendtype("LMS");
+//		dm.setButtonNm("마이페이지 > 1:1문의");
+//		dm.setButtonUrl("/mypage/counsel/detail/form/" + counsel.getCounselSq());
+//
+//		GagaMap replaceInfo = new GagaMap();
+//		replaceInfo.setString("siteNm", systemService.getSiteName(AdmConstants.SITE_CD));
+//		replaceInfo.setString("custNm", counsel.getCustNm());
+//
+//		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.OtoAnswer.value(), dm, replaceInfo);
+//
+//		try {
+//			// 고객접촉이력 정보
+//			AdmCustomer customer = new AdmCustomer();
+//			customer.setContactType("204"); // 접촉유형:1:1문의답변(공통코드G054)
+//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
+//			customer.setContactContents("1:1 문의 답변 발송");
+//			customer.setReceiverId(counsel.getCustNo());
+//			customerService.createCustomerContactHistory(customer);
+//		} catch (Exception e) {
+//			log.error("error", e);
+//			// Do nothing
+//		}
+//	}
+//
+//	/**
+//	 * 인증번호발송
+//	 * @param customer - 인증번호 발송
+//	 * @author jsshin
+//	 * @since 2020. 4. 8
+//	 */
+//	public void sendCustomerCertNo(AdmCustomer customer) {
+//		SsgDirectMessage dm = new SsgDirectMessage();
+//		dm.setFdestine(customer.getCellPhnno());
+//		dm.setFkkoresendtype("LMS");
+//
+//		GagaMap replaceInfo = new GagaMap();
+//		replaceInfo.setString("siteNm", customer.getSiteNm());
+//		replaceInfo.setString("custNm", customer.getCustNm());
+//		replaceInfo.setString("certNo", customer.getCertNo());
+//
+//		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.CertNoSend.value(), dm, replaceInfo);
+//
+//		try {
+//			// 고객접촉이력 정보
+//			customer.setContactType("209"); // 접촉유형:1:1문의답변(공통코드G054)
+//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
+//			customer.setContactContents("인증번호");
+//			customer.setReceiverId(customer.getCustNo());
+//			customerService.createCustomerContactHistory(customer);
+//		} catch (Exception e) {
+//			log.error("error", e);
+//			// Do nothing
+//		}
+//	}
+//
+//	/**
+//	 * 품절에의한 주문취소 안내
+//	 * @param delivery
+//	 * @author yujung
+//	 * @since 2020. 4. 23
+//	 */
+//	public void sendCancelBySoldout(String payMeans, AdmDelivery delivery) {
+//		SsgDirectMessage dm = new SsgDirectMessage();
+//		dm.setFdestine(delivery.getOrderPhnno());
+//		dm.setFkkoresendtype("LMS");
+//
+//		GagaMap replaceInfo = new GagaMap();
+//		replaceInfo.setString("siteNm", systemService.getSiteName(AdmConstants.SITE_CD));
+//		replaceInfo.setString("custNm", delivery.getOrderNm());
+//		replaceInfo.setString("goodsNm", delivery.getGoodsNm());
+//		replaceInfo.setString("callcenterTelNo", TscConstants.CALLCENTER_TEL_NO);
+//
+//		Integer KakaoAnswerSq = null;
+//		if (payMeans.equals(TscConstants.PayMeans.CREDIT_CARD.value())) { // 신용카드
+//			KakaoAnswerSq = SsgKakaoSender.KakaoAnswerSq.CardCancelBySoldout.value();
+//		} else if (payMeans.equals(TscConstants.PayMeans.ACCOUNT_TRANSFER.value())) { // 실시간계좌이체
+//			KakaoAnswerSq = SsgKakaoSender.KakaoAnswerSq.AtCancelBySoldout.value();
+//		} else if (payMeans.equals(TscConstants.PayMeans.BANK_DEPOSIT.value())) { // 무통장입금
+//			KakaoAnswerSq = SsgKakaoSender.KakaoAnswerSq.VaCancelBySoldout.value();
+//		}
+//
+//		kakaoSender.send(KakaoAnswerSq, dm, replaceInfo);
+//
+//		try {
+//			// 고객접촉이력 정보
+//			AdmCustomer customer = new AdmCustomer();
+//			customer.setContactType("304"); // 접촉유형 : 주문-품절안내(공통코드G054)
+//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법 : 알림톡+문자(공통코드G055)
+//			customer.setContactContents("품절에의한 주문취소 안내");
+//			customer.setReceiverId(delivery.getCustNo());
+//			customerService.createCustomerContactHistory(customer);
+//		} catch (Exception e) {
+//			log.error("error", e);
+//			// Do nothing
+//		}
+//	}
+//
+//	/**
+//	 * 주문취소안내 알림톡
+//	 * @param customer - 고객 정보
+//	 * @author gagamel
+//	 * @since 2020. 11. 9
+//	 */
+//	@Transactional("shopTxnManager")
+//	public void sendOrderCancel(AdmCustomer customer, AdmOrder order) {
+//		SsgDirectMessage dm = new SsgDirectMessage();
+//		dm.setFdestine(customer.getCellPhnno());
+//		dm.setFkkoresendtype("LMS");
+//
+//		dm.setButtonNm("마이페이지 > 주문내역");
+//		dm.setButtonUrl("/mypage/order/list/form");
+//
+//		GagaMap replaceInfo = new GagaMap();
+//		replaceInfo.setString("siteNm", systemService.getSiteName(AdmConstants.SITE_CD));
+//		replaceInfo.setString("custNm", customer.getCustNm());
+//
+//		if (order.getPayMeans().equals(TscConstants.PayMeans.CREDIT_CARD.value())) { // 신용카드
+//			kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.CardCancelRefund.value(), dm, replaceInfo);
+//		} else if (order.getPayMeans().equals(TscConstants.PayMeans.ACCOUNT_TRANSFER.value())) { // 실시간계좌이체
+//			kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.AtCancelRefund.value(), dm, replaceInfo);
+//		} else if (order.getPayMeans().equals(TscConstants.PayMeans.BANK_DEPOSIT.value())) { // 무통장입금
+//			kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.VaCancelRefund.value(), dm, replaceInfo);
+//		}
+//
+//		try {
+//			// 고객접촉이력 정보
+//			customer.setContactType("305"); // 접촉유형:주문안내(공통코드G054)
+//			customer.setContactMethod(TscConstants.ContactMethod.KAKAOTALK.value()); // 접촉방법:알림톡+문자(공통코드G055)
+//			customer.setContactContents("주문-취소안내");
+//			customer.setReceiverId(customer.getCustNo());
+//			customerService.createCustomerContactHistory(customer);
+//		} catch (Exception e) {
+//			log.error("error", e);
+//			// Do nothing
+//		}
+//	}
+//
+//	/**
+//	 * 기본 LMS 발송
+//	 * @param customer - LMS 정보
+//	 * @author gagamel
+//	 * @since 2020. 11. 9
+//	 */
+//	@Transactional("shopTxnManager")
+//	public void sendCustomerBasicLms(AdmCustomer customer) {
+//		SsgDirectMessage dm = new SsgDirectMessage();
+//		dm.setFdestine(customer.getCellPhnno());
+//
+//		GagaMap replaceInfo = new GagaMap();
+//		replaceInfo.setString("siteNm", customer.getSiteNm());
+//		replaceInfo.setString("custNm", customer.getCustNm());
+//		replaceInfo.setString("content", customer.getContent());
+//		replaceInfo.setString("callcenterTelNo", TscConstants.CALLCENTER_TEL_NO);
+//		kakaoSender.sendLms(SsgKakaoSender.KakaoAnswerSq.BasicLms.value(), dm, replaceInfo);
+//
+//		try {
+//			// 고객접촉이력 정보
+//			customer.setContactType("207"); // 접촉유형:회원-기본LMS안내발송
+//			customer.setContactMethod(TscConstants.ContactMethod.LMS.value()); // 접촉방법:LMS(공통코드G055)
+//			customer.setContactContents("기본LMS안내발송");
+//			customer.setReceiverId(customer.getCustNo());
+//			customerService.createCustomerContactHistory(customer);
+//		} catch (Exception e) {
+//			log.error("error", e);
+//			// Do nothing
+//		}
+//	}
+
+}

+ 111 - 111
style24.admin/src/main/java/com/style24/admin/biz/service/TsaLoginService.java

@@ -1,111 +1,111 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.style24.admin.biz.dao.TsaLoginDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.persistence.domain.Menu;
-import com.style24.persistence.domain.User;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 운영관리 Service
- *
- * @author gagamel
- * @since 2019. 12. 4
- */
-@Service
-@Slf4j
-public class TsaLoginService {
-
-	@Autowired
-	private TsaLoginDao loginDao;
-
-	@Autowired
-	private Environment env;
-
-	/**
-	 * 사용자ID로 사용자 정보 조회
-	 * @param userId - 사용자ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 5
-	 */
-	public User getUserById(String userId) {
-		return loginDao.getUserById(userId);
-	}
-
-	/**
-	 * 로그인실패 남기기. 로그인실패여부가 "N:성공"이면 실패건수 0으로 초기화
-	 * @param userNo - 사용자번호
-	 * @param loginFailYn - 로그인실패여부(Y:실패, N:성공)
-	 * @author gagamel
-	 * @since 2020. 10. 5
-	 */
-	@Transactional("shopTxnManager")
-	public void createLoginFail(Integer userNo, String loginFailYn) {
-		User user = new User();
-		user.setUserNo(userNo);
-		user.setIpAddr(TsaSession.getIpAddress());
-		user.setLoginFailYn(loginFailYn);
-		loginDao.createLoginFail(user);
-	}
-
-	/**
-	 * 로그인 실패건수 조회
-	 * @param userNo - 사용자번호
-	 * @return 로그인 실패건수
-	 * @author gagamel
-	 * @since 2020. 10. 5
-	 */
-	public int getLoginFailCount(Integer userNo) {
-		User user = new User();
-		user.setUserNo(userNo);
-		user.setIpAddr(TsaSession.getIpAddress());
-		return loginDao.getLoginFailCount(user);
-	}
-
-	/**
-	 * 최종로그인일시 Update
-	 * @param userNo - 사용자번호
-	 * @author gagamel
-	 * @since 2020. 10. 5
-	 */
-	@Transactional("shopTxnManager")
-	public void updateLastLoginDate(Integer userNo) {
-		loginDao.updateLastLoginDate(userNo);
-	}
-
-	/**
-	 * 로그인이력 남기기
-	 * @param userNo - 사용자번호
-	 * @author gagamel
-	 * @date 2020. 10. 5
-	 */
-	@Transactional("shopTxnManager")
-	public void createLoginHistory(Integer userNo) {
-		User user = new User();
-		user.setUserNo(userNo);
-		user.setIpAddr(TsaSession.getIpAddress());
-
-		loginDao.createLoginHistory(user);
-	}
-
-	/**
-	 * 로그인 메뉴 목록
-	 * @param userNo - 사용자번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 5
-	 */
-	public Collection<Menu> getLoginMenuList(Integer userNo) {
-		return loginDao.getLoginMenuList(userNo);
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaLoginDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.Menu;
+import com.style24.persistence.domain.User;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 운영관리 Service
+ *
+ * @author gagamel
+ * @since 2019. 12. 4
+ */
+@Service
+@Slf4j
+public class TsaLoginService {
+
+	@Autowired
+	private TsaLoginDao loginDao;
+
+	@Autowired
+	private Environment env;
+
+	/**
+	 * 사용자ID로 사용자 정보 조회
+	 * @param userId - 사용자ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 5
+	 */
+	public User getUserById(String userId) {
+		return loginDao.getUserById(userId);
+	}
+
+	/**
+	 * 로그인실패 남기기. 로그인실패여부가 "N:성공"이면 실패건수 0으로 초기화
+	 * @param userNo - 사용자번호
+	 * @param loginFailYn - 로그인실패여부(Y:실패, N:성공)
+	 * @author gagamel
+	 * @since 2020. 10. 5
+	 */
+	@Transactional("shopTxnManager")
+	public void createLoginFail(Integer userNo, String loginFailYn) {
+		User user = new User();
+		user.setUserNo(userNo);
+		user.setIpAddr(TsaSession.getIpAddress());
+		user.setLoginFailYn(loginFailYn);
+		loginDao.createLoginFail(user);
+	}
+
+	/**
+	 * 로그인 실패건수 조회
+	 * @param userNo - 사용자번호
+	 * @return 로그인 실패건수
+	 * @author gagamel
+	 * @since 2020. 10. 5
+	 */
+	public int getLoginFailCount(Integer userNo) {
+		User user = new User();
+		user.setUserNo(userNo);
+		user.setIpAddr(TsaSession.getIpAddress());
+		return loginDao.getLoginFailCount(user);
+	}
+
+	/**
+	 * 최종로그인일시 Update
+	 * @param userNo - 사용자번호
+	 * @author gagamel
+	 * @since 2020. 10. 5
+	 */
+	@Transactional("shopTxnManager")
+	public void updateLastLoginDate(Integer userNo) {
+		loginDao.updateLastLoginDate(userNo);
+	}
+
+	/**
+	 * 로그인이력 남기기
+	 * @param userNo - 사용자번호
+	 * @author gagamel
+	 * @date 2020. 10. 5
+	 */
+	@Transactional("shopTxnManager")
+	public void createLoginHistory(Integer userNo) {
+		User user = new User();
+		user.setUserNo(userNo);
+		user.setIpAddr(TsaSession.getIpAddress());
+
+		loginDao.createLoginHistory(user);
+	}
+
+	/**
+	 * 로그인 메뉴 목록
+	 * @param userNo - 사용자번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 5
+	 */
+	public Collection<Menu> getLoginMenuList(Integer userNo) {
+		return loginDao.getLoginMenuList(userNo);
+	}
+
+}

+ 153 - 153
style24.admin/src/main/java/com/style24/admin/biz/service/TsaNoticeService.java

@@ -1,153 +1,153 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.style24.admin.biz.dao.TsaNoticeDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.persistence.domain.Notice;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 공지사항 Service
- *
- * @author gagamel
- * @since 2020. 10. 30
- */
-@Service
-@Slf4j
-public class TsaNoticeService {
-
-	@Autowired
-	private TsaNoticeDao noticeDao;
-
-	/**
-	 * 공지사항 목록
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	public Collection<Notice> getNoticeList(Notice notice) {
-		return noticeDao.getNoticeList(notice);
-	}
-
-	/**
-	 * 공지사항 수신자 목록
-	 * @param noticeSq - 공지사항일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	public Collection<Notice> getNoticeReceiverList(Integer noticeSq) {
-		return noticeDao.getNoticeReceiverList(noticeSq);
-	}
-
-	/**
-	 * 공지사항 파일 목록
-	 * @param noticeSq - 공지사항일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	public Collection<Notice> getNoticeFileList(Integer noticeSq) {
-		return noticeDao.getNoticeFileList(noticeSq);
-	}
-
-	/**
-	 * 공지사항 저장
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	@Transactional("shopTxnManager")
-	public void saveNotice(Notice notice) {
-		notice.setRegNo(TsaSession.getInfo().getUserNo());
-		notice.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		// 신규 일때
-		if (notice.getNoticeSq() == null) {
-			// 공지사항 저장
-			noticeDao.createNotice(notice);
-
-			// 등록된 사용자번호 값 가져오기
-			Integer noticeSq = notice.getNoticeSq();
-			log.info("noticeSq: {}", noticeSq);
-			notice.setNoticeSq(noticeSq);
-		} else {
-			// 공지사항 수정
-			noticeDao.updateNotice(notice);
-		}
-
-		// 수신자 저장
-		if (!StringUtils.isAllBlank(notice.getReceiverIds())) {
-			noticeDao.deleteNoticeReceiver(notice);
-
-//			for (int i = 0; i < notice.getReceiverIds().length; i++) {
-			for (String receiverId : notice.getReceiverIds()) {
-				if (StringUtils.isNotBlank(receiverId)) {
-					notice.setReceiverId(receiverId);
-					log.info("noticeReceiver: {}", notice);
-					noticeDao.createNoticeReceiver(notice);
-				}
-			}
-		}
-
-		// 파일이 존재할때
-		if (!StringUtils.isAllBlank(notice.getSysFileNms())) {
-			noticeDao.deleteNoticeFile(notice);
-
-			for (int i = 0; i < notice.getFileCnt(); i++) {
-				notice.setOrgFileNm(notice.getOrgFileNms()[i]);
-				notice.setSysFileNm(notice.getSysFileNms()[i]);
-				log.info("noticeFile: {}", notice);
-				noticeDao.createNoitceFlie(notice);
-			}
-		}
-	}
-
-	/**
-	 * 공지사항 첨부파일 삭제
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteNoticeFile(Notice notice) {
-		noticeDao.deleteNoticeFile(notice);
-	}
-
-	/**
-	 * 공지사항 등록(상품상세공지에서 사용)
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 05
-	 */
-	@Transactional("shopTxnManager")
-	public void createNotice(Notice notice) {
-		noticeDao.createNotice(notice);
-	}
-
-	/**
-	 * 공지사항 수정(상품상세공지에서 사용)
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 05
-	 */
-	@Transactional("shopTxnManager")
-	public void updateNotice(Notice notice) {
-		noticeDao.updateNotice(notice);
-	}
-
-
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaNoticeDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.Notice;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 공지사항 Service
+ *
+ * @author gagamel
+ * @since 2020. 10. 30
+ */
+@Service
+@Slf4j
+public class TsaNoticeService {
+
+	@Autowired
+	private TsaNoticeDao noticeDao;
+
+	/**
+	 * 공지사항 목록
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	public Collection<Notice> getNoticeList(Notice notice) {
+		return noticeDao.getNoticeList(notice);
+	}
+
+	/**
+	 * 공지사항 수신자 목록
+	 * @param noticeSq - 공지사항일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	public Collection<Notice> getNoticeReceiverList(Integer noticeSq) {
+		return noticeDao.getNoticeReceiverList(noticeSq);
+	}
+
+	/**
+	 * 공지사항 파일 목록
+	 * @param noticeSq - 공지사항일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	public Collection<Notice> getNoticeFileList(Integer noticeSq) {
+		return noticeDao.getNoticeFileList(noticeSq);
+	}
+
+	/**
+	 * 공지사항 저장
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	@Transactional("shopTxnManager")
+	public void saveNotice(Notice notice) {
+		notice.setRegNo(TsaSession.getInfo().getUserNo());
+		notice.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		// 신규 일때
+		if (notice.getNoticeSq() == null) {
+			// 공지사항 저장
+			noticeDao.createNotice(notice);
+
+			// 등록된 사용자번호 값 가져오기
+			Integer noticeSq = notice.getNoticeSq();
+			log.info("noticeSq: {}", noticeSq);
+			notice.setNoticeSq(noticeSq);
+		} else {
+			// 공지사항 수정
+			noticeDao.updateNotice(notice);
+		}
+
+		// 수신자 저장
+		if (!StringUtils.isAllBlank(notice.getReceiverIds())) {
+			noticeDao.deleteNoticeReceiver(notice);
+
+//			for (int i = 0; i < notice.getReceiverIds().length; i++) {
+			for (String receiverId : notice.getReceiverIds()) {
+				if (StringUtils.isNotBlank(receiverId)) {
+					notice.setReceiverId(receiverId);
+					log.info("noticeReceiver: {}", notice);
+					noticeDao.createNoticeReceiver(notice);
+				}
+			}
+		}
+
+		// 파일이 존재할때
+		if (!StringUtils.isAllBlank(notice.getSysFileNms())) {
+			noticeDao.deleteNoticeFile(notice);
+
+			for (int i = 0; i < notice.getFileCnt(); i++) {
+				notice.setOrgFileNm(notice.getOrgFileNms()[i]);
+				notice.setSysFileNm(notice.getSysFileNms()[i]);
+				log.info("noticeFile: {}", notice);
+				noticeDao.createNoitceFlie(notice);
+			}
+		}
+	}
+
+	/**
+	 * 공지사항 첨부파일 삭제
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteNoticeFile(Notice notice) {
+		noticeDao.deleteNoticeFile(notice);
+	}
+
+	/**
+	 * 공지사항 등록(상품상세공지에서 사용)
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 05
+	 */
+	@Transactional("shopTxnManager")
+	public void createNotice(Notice notice) {
+		noticeDao.createNotice(notice);
+	}
+
+	/**
+	 * 공지사항 수정(상품상세공지에서 사용)
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 05
+	 */
+	@Transactional("shopTxnManager")
+	public void updateNotice(Notice notice) {
+		noticeDao.updateNotice(notice);
+	}
+
+
+
+}

+ 94 - 94
style24.admin/src/main/java/com/style24/admin/biz/service/TsaOcmService.java

@@ -1,94 +1,94 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.style24.admin.biz.dao.TsaOcmDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Extmall;
-import com.style24.persistence.domain.ExtmallNoti;
-import com.style24.persistence.domain.ExtmallPriceSync;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 영업망관리 Service
- *
- * @author gagamel
- * @since 2020. 11. 4
- */
-@Service
-@Slf4j
-public class TsaOcmService {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private TsaOcmDao ocmDao;
-
-	/**
-	 * 제휴몰 목록
-	 * @param extmall - 제휴몰 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	public Collection<Extmall> getExtmallList(Extmall extmall) {
-		return ocmDao.getExtmallList(extmall);
-	}
-
-	/**
-	 * 제휴몰 등록/수정 처리
-	 * @param extmall - 제휴몰 정보
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	@Transactional("shopTxnManager")
-	public void saveExtmall(Extmall extmall) {
-		extmall.setRegNo(TsaSession.getInfo().getUserNo());
-		extmall.setUpdNo(TsaSession.getInfo().getUserNo());
-		ocmDao.saveExtmall(extmall);
-	}
-
-	/**
-	 * 제휴몰 고시정보 목록
-	 * @param extmallNoti - 제휴몰고시정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 6
-	 */
-	public Collection<ExtmallNoti> getExtmallNotiinfoList(ExtmallNoti extmallNoti) {
-		return ocmDao.getExtmallNotiinfoList(extmallNoti);
-	}
-
-	/**
-	 * 제휴몰가격연계 목록
-	 * @param extmallPriceSync - 제휴몰가격연계 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	public Collection<ExtmallPriceSync> getExtmallPriceSyncList(ExtmallPriceSync extmallPriceSync) {
-		return ocmDao.getExtmallPriceSyncList(extmallPriceSync);
-	}
-
-	/**
-	 * 제휴몰가격연계 등록/수정
-	 * @param extmallPriceSyncList - 제휴몰가격연계 목록
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	public void saveExtmallPriceSync(Collection<ExtmallPriceSync> extmallPriceSyncList) {
-		for (ExtmallPriceSync extmallPriceSync : extmallPriceSyncList) {
-			extmallPriceSync.setRegNo(TsaSession.getInfo().getUserNo());
-			extmallPriceSync.setUpdNo(TsaSession.getInfo().getUserNo());
-			ocmDao.saveExtmallPriceSync(extmallPriceSync);
-		}
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaOcmDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Extmall;
+import com.style24.persistence.domain.ExtmallNoti;
+import com.style24.persistence.domain.ExtmallPriceSync;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 영업망관리 Service
+ *
+ * @author gagamel
+ * @since 2020. 11. 4
+ */
+@Service
+@Slf4j
+public class TsaOcmService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaOcmDao ocmDao;
+
+	/**
+	 * 제휴몰 목록
+	 * @param extmall - 제휴몰 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	public Collection<Extmall> getExtmallList(Extmall extmall) {
+		return ocmDao.getExtmallList(extmall);
+	}
+
+	/**
+	 * 제휴몰 등록/수정 처리
+	 * @param extmall - 제휴몰 정보
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	@Transactional("shopTxnManager")
+	public void saveExtmall(Extmall extmall) {
+		extmall.setRegNo(TsaSession.getInfo().getUserNo());
+		extmall.setUpdNo(TsaSession.getInfo().getUserNo());
+		ocmDao.saveExtmall(extmall);
+	}
+
+	/**
+	 * 제휴몰 고시정보 목록
+	 * @param extmallNoti - 제휴몰고시정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 6
+	 */
+	public Collection<ExtmallNoti> getExtmallNotiinfoList(ExtmallNoti extmallNoti) {
+		return ocmDao.getExtmallNotiinfoList(extmallNoti);
+	}
+
+	/**
+	 * 제휴몰가격연계 목록
+	 * @param extmallPriceSync - 제휴몰가격연계 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public Collection<ExtmallPriceSync> getExtmallPriceSyncList(ExtmallPriceSync extmallPriceSync) {
+		return ocmDao.getExtmallPriceSyncList(extmallPriceSync);
+	}
+
+	/**
+	 * 제휴몰가격연계 등록/수정
+	 * @param extmallPriceSyncList - 제휴몰가격연계 목록
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	public void saveExtmallPriceSync(Collection<ExtmallPriceSync> extmallPriceSyncList) {
+		for (ExtmallPriceSync extmallPriceSync : extmallPriceSyncList) {
+			extmallPriceSync.setRegNo(TsaSession.getInfo().getUserNo());
+			extmallPriceSync.setUpdNo(TsaSession.getInfo().getUserNo());
+			ocmDao.saveExtmallPriceSync(extmallPriceSync);
+		}
+	}
+
+}

+ 523 - 523
style24.admin/src/main/java/com/style24/admin/biz/service/TsaRendererService.java

@@ -1,523 +1,523 @@
-package com.style24.admin.biz.service;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.style24.admin.biz.dao.TsaRendererDao;
-import com.style24.persistence.domain.Brand;
-import com.style24.persistence.domain.Color;
-import com.style24.persistence.domain.CommonCode;
-import com.style24.persistence.domain.DeliveryLoc;
-import com.style24.persistence.domain.Itemkind;
-import com.style24.persistence.domain.SupplyCompany;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 콤보박스, 체크박스, 라디오버튼 구성 시 필요한 Renderer Service
- *
- * @author gagamel
- * @since 2020. 10. 7
- */
-@Service
-@Slf4j
-public class TsaRendererService {
-
-	@Autowired
-	private TsaRendererDao rendererDao;
-
-	/**
-	 * 연도 목록
-	 * @param startYear - 시작연도
-	 * @param startOffset - Start offset. 시작연도
-	 * @param endOffset - End offset. 종료연도
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 22.
-	 */
-	public Collection<CommonCode> getYearList(int startYear, int startOffset, int endOffset) {
-		Collection<CommonCode> yearList = new ArrayList<>();
-
-		int start = startYear + startOffset;
-		int end = startYear + endOffset;
-
-		for (int year = start; year <= end; year++) {
-			CommonCode commonCode = new CommonCode();
-
-			commonCode.setCd(String.valueOf(year));
-			commonCode.setCdNm(String.valueOf(year));
-
-			yearList.add(commonCode);
-		}
-
-		return yearList;
-	}
-
-	/**
-	 * 공급업체 목록
-	 * @param supplyCompany - 공급업체 정보
-	 * @return 공급업체 목록
-	 * @author Daehyoung
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getSupplyCompanyList(SupplyCompany supplyCompany) {
-		return rendererDao.getSupplyCompanyList(supplyCompany);
-	}
-
-	/**
-	 * 공급업체 목록
-	 * @return 공급업체 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getSupplyCompanyList() {
-		return this.getSupplyCompanyList(new SupplyCompany());
-	}
-
-	/**
-	 * 공급업체 목록
-	 * @param supplyCompCd - 공급업체코드
-	 * @return 공급업체 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getSupplyCompanyList(String supplyCompCd) {
-		SupplyCompany supplyCompany = new SupplyCompany();
-		supplyCompany.setSupplyCompCd(supplyCompCd);
-		return this.getSupplyCompanyList(supplyCompany);
-	}
-
-	/**
-	 * 공급업체 목록
-	 * @param supplyCompCd - 공급업체코드
-	 * @param selfYn - 자사여부
-	 * @return 공급업체 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getSupplyCompanyList(String supplyCompCd, String selfYn) {
-		SupplyCompany supplyCompany = new SupplyCompany();
-		supplyCompany.setSupplyCompCd(supplyCompCd);
-		supplyCompany.setSelfYn(selfYn);
-		return this.getSupplyCompanyList(supplyCompany);
-	}
-
-	/**
-	 * 자사공급업체 목록
-	 * @return 자사공급업체 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getSelfSupplyCompanyList() {
-		SupplyCompany supplyCompany = new SupplyCompany();
-		supplyCompany.setSelfYn("Y");
-		return this.getSupplyCompanyList(supplyCompany);
-	}
-
-	/**
-	 * 입점공급업체 목록
-	 * @return 입점공급업체 목록
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	public Collection<CommonCode> getEntrSupplyCompanyList() {
-		SupplyCompany supplyCompany = new SupplyCompany();
-		supplyCompany.setSelfYn("N");
-		return this.getSupplyCompanyList(supplyCompany);
-	}
-
-	/**
-	 * 공통코드 목록 - 어드민 공통코드 캐시 미적용 - 상품등록시 시즌년도 캐쉬로 인한 정보 오류로 수정 2020.06.02
-	 * @param commoncode - 공통코드 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-//	@Cacheable(value = "common", key = "'commoncode-'.concat(#commoncode.cdGb)")
-	public Collection<CommonCode> getCommonCodeList(CommonCode commoncode) {
-		return rendererDao.getCommonCodeList(commoncode);
-	}
-
-	/**
-	 * 공통코드 목록
-	 * @param cdGb - 코드구분
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getCommonCodeList(String cdGb) {
-		CommonCode commoncode = new CommonCode();
-		commoncode.setCdGb(cdGb);
-		return this.getCommonCodeList(commoncode);
-	}
-
-	/**
-	 * 공통코드 목록
-	 * @param grpCodeId - 코드구분
-	 * @param useYn     - 사용여부
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getCommonCodeList(String cdGb, String useYn) {
-		CommonCode commoncode = new CommonCode();
-		commoncode.setCdGb(cdGb);
-		commoncode.setUseYn(useYn);
-		return this.getCommonCodeList(commoncode);
-	}
-
-	/**
-	 * 현재 유효한 공통코드 목록
-	 * @param cdGb - 코드구분
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getAvailCommonCodeList(String cdGb) {
-		return this.getCommonCodeList(cdGb, "Y");
-	}
-
-	/**
-	 * 공통코드 목록
-	 * @param cdGb   -코드구분
-	 * @param useYn  - 사용여부
-	 * @param cdDesc - 코드설명
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getCommonCodeList(String cdGb, String useYn, String cdDesc) {
-		CommonCode commoncode = new CommonCode();
-		commoncode.setCdGb(cdGb);
-		commoncode.setUseYn(useYn);
-		commoncode.setCdDesc(cdDesc);
-		return this.getCommonCodeList(commoncode);
-	}
-
-	/**
-	 * 공통코드 목록
-	 * @param cdGb      -코드구분
-	 * @param useYn     - 사용여부
-	 * @param exceptCds - 제외코드배열
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getCommonCodeList(String cdGb, String useYn, String[] exceptCds) {
-		CommonCode commoncode = new CommonCode();
-		commoncode.setCdGb(cdGb);
-		commoncode.setUseYn(useYn);
-		commoncode.setExceptCds(exceptCds);
-		return this.getCommonCodeList(commoncode);
-	}
-
-	/**
-	 * 최상위메뉴 목록
-	 * @param menuId - 메뉴ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getTopMenuList(String menuId) {
-		return rendererDao.getTopMenuList(menuId);
-	}
-
-	/**
-	 * 전체 메뉴 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getAllMenuList() {
-		return rendererDao.getAllMenuList();
-	}
-
-//	/**
-//	 * 벤더외부몰 목록
-//	 * @param vendorId - 벤더ID
-//	 * @return 벤더외부몰 목록
-//	 * @author gagamel
-//	 * @since 2019. 8. 11
-//	 */
-//	public Collection<CommonCode> getVendorExtmallList(String vendorId) {
-//		return rendererDao.getVendorExtmallList(vendorId);
-//	}
-//
-//	/**
-//	 * 벤더외부몰판매매장 목록
-//	 * @param vendorId - 벤더ID
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 4. 28
-//	 */
-//	public Collection<CommonCode> getVendorExtmallSellStoreList(String vendorId) {
-//		return rendererDao.getVendorExtmallSellStoreList(vendorId);
-//	}
-//
-//	//
-//	//	/**
-//	//	 * 유효한 브랜드 목록
-//	//	 * @param
-//	//	 * @return
-//	//	 * @author qkwlstktma
-//	//	 * @since 2019. 8. 25
-//	//	 */
-//	//	public Collection<CommonCode> getAvailableBrandList() {
-//	//		AdmBrand brand = new AdmBrand();
-//	//		brand.setUseYn("Y");
-//	//		return rendererDao.getBrandList(brand);
-//	//	}
-//	//
-	/**
-	 * 공급업체 브랜드 목록
-	 * @param supplyCompCd - 공급업체코드
-	 * @return
-	 * @author gagamel
-	 * @since 2019. 10. 20
-	 */
-	public Collection<CommonCode> getSupplyCompanyBrandList(String supplyCompCd) {
-		Brand brand = new Brand();
-		brand.setSupplyCompCd(supplyCompCd);
-		return rendererDao.getBrandList(brand);
-	}
-
-//
-//	/**
-//	 * 브랜드그룹별 브랜드 목록
-//	 * @param brandGrpNm - 브랜드그룹명
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 1. 10
-//	 */
-//	public Collection<CommonCode> getGroupBrandList(String brandGrpNm) {
-//		AdmBrand brand = new AdmBrand();
-//		brand.setBrandGrpNm(brandGrpNm);
-//		return rendererDao.getBrandList(brand);
-//	}
-//
-	/**
-	 * 권한별 브랜드 목록
-	 * @param adminId - 사용자ID
-	 * @return
-	 * @author eskim
-	 * @since 2019. 6. 17
-	 */
-	public Collection<CommonCode> getAuthBrandList(int userNo) {
-		return rendererDao.getAuthBrandList(userNo);
-	}
-
-	/**
-	 * 출고처 목록
-	 * @param delvLoc - 출고처 정보
-	 * @return 출고처 목록
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	public Collection<CommonCode> getDeliveryLocList(DeliveryLoc delvLoc) {
-		return rendererDao.getDeliveryLocList(delvLoc);
-	}
-
-//	/**
-//	 * 출고처 목록
-//	 * @return 출고처 목록
-//	 * @author gagamel
-//	 * @since 2019. 12. 12
-//	 */
-//	public Collection<CommonCode> getDeliveryLocList() {
-//		AdmDeliveryLoc params = new AdmDeliveryLoc();
-//		return this.getDeliveryLocList(params);
-//	}
-
-	/**
-	 * 출고처 목록
-	 * @param supplyCompCd - 공급업체코드
-	 * @return 출고처 목록
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	public Collection<CommonCode> getDeliveryLocList(String supplyCompCd) {
-		DeliveryLoc delvLoc = new DeliveryLoc();
-		delvLoc.setSupplyCompCd(supplyCompCd);
-		return this.getDeliveryLocList(delvLoc);
-	}
-
-//	/**
-//	 * 직송매장 목록
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 5. 4
-//	 */
-//	public Collection<CommonCode> getDirectStoreList() {
-//		AdmDeliveryLoc params = new AdmDeliveryLoc();
-//		params.setDelvLocClsf("21"); // 직송매장
-//		return this.getDeliveryLocList(params);
-//	}
-//
-//	//	/**
-//	//	 * 정보고시 목록
-//	//	 * @param goodsCd - 상품코드
-//	//	 * @return
-//	//	 * @author jaewonHo
-//	//	 * @param supplyCompCd
-//	//	 * @since 2019. 10. 24
-//	//	 */
-//	//	public Collection<CommonCode> getCateInfoList(String goodsCd) {
-//	//		return rendererDao.getCateInfoList(goodsCd);
-//	//	}
-//
-	/**
-	 * 품목 목록
-	 * @return 품목 목록
-	 * @author eskim
-	 * @since 2020. 10. 19
-	 */
-	public Collection<CommonCode> getAllItemkindList() {
-		Itemkind itemkind = new Itemkind();
-		return this.getItemkindList(itemkind);
-	}
-
-	/**
-	 * 품목 목록
-	 * @param itemkind - 품목 정보
-	 * @return 품목 목록
-	 * @author eskim
-	 * @since 2020. 10. 19
-	 */
-	public Collection<CommonCode> getItemkindList(Itemkind itemkind) {
-		return rendererDao.getItemkindList(itemkind);
-	}
-
-//	/**
-//	 * 브랜드그룹 목록
-//	 * @return 브랜드그룹 목록
-//	 * @author eskim
-//	 * @since 2019. 12. 10
-//	 */
-//	public Collection<CommonCode> getBrandGroupList() {
-//		return rendererDao.getBrandGroupList();
-//	}
-//
-	/**
-	 * 컬러 목록
-	 * @param color - 색상 정보
-	 * @return 컬러 목록
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	public Collection<CommonCode> getColorList(Color color) {
-		return rendererDao.getColorList(color);
-	}
-
-//
-//	/**
-//	 * 사용중 대카테고리 목록
-//	 * @param cateGb - 카테고리구분
-//	 * @return 대카테고리 목록
-//	 * @author sasa004
-//	 * @since 2020. 01. 02
-//	 */
-//	public Collection<CommonCode> getTCategoryList(String cateGb) {
-//		return rendererDao.getTCategoryList(cateGb);
-//	}
-//
-	/**
-	 * 브랜드에 등록된 MD 목록
-	 * @return MD 목록
-	 * @author eskim
-	 * @since 2020. 10. 19
-	 */
-	public Collection<CommonCode> getBrandMdList() {
-		return rendererDao.getBrandMdList();
-	}
-
-	/**
-	 * 택배사명 목록 조회
-	 * @return CommonCode
-	 * @author moon
-	 * @since 2020. 11. 05
-	 */
-	public Collection<CommonCode> getShipCompanyList() {
-		return rendererDao.getShipCompanyList();
-	}
-//
-//	/**
-//	 * MD 별 브랜드 목록 조회
-//	 * @param mdId - 담당MD아이디
-//	 * @return CommonCode
-//	 * @author jaewonHo
-//	 * @since 2020. 02. 11
-//	 */
-//	public Collection<CommonCode> getMdBrandList(String mdId) {
-//		return rendererDao.getMdBrandList(mdId);
-//	}
-//
-//	/**
-//	 * MD 별 브랜드 목록 조회
-//	 * @param mdId - 담당MD아이디
-//	 * @return CommonCode
-//	 * @author jaewonHo
-//	 * @since 2020. 02. 11
-//	 */
-//	public Collection<CommonCode> getMdBrandGrpList(String mdId) {
-//		return rendererDao.getMdBrandGrpList(mdId);
-//	}
-//
-//	/**
-//	 * 인스타그램 계정리스트 조회
-//	 * @return
-//	 * @since : 2020. 3. 18.
-//	 * @authur 이명철
-//	 */
-//	public Collection<CommonCode> getInstaAccount() {
-//		return rendererDao.getInstaAccount();
-//	}
-//
-//	/**
-//	 * 판매몰조회
-//	 * @param
-//	 * @return CommonCode
-//	 * @author swkim
-//	 * @since 2020. 03. 19
-//	 */
-//	public Collection<CommonCode> getSellStoreList() {
-//		return rendererDao.getSellStoreList();
-//	}
-//
-//	/**
-//	 * 기본답변문구 제목 조회
-//	 * @param
-//	 * @return CommonCode
-//	 * @author yujing
-//	 * @since 2020. 04. 02
-//	 */
-//	public Collection<CommonCode> getBasicAnsTitleList(String ansClsf) {
-//		return rendererDao.getBasicAnsTitleList(ansClsf);
-//	}
-//
-//	/**
-//	 * 제휴링크 목록
-//	 * @param afChannel - 제휴채널
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 5. 4
-//	 */
-//	public Collection<CommonCode> getAflinkList(String afChannel) {
-//		return rendererDao.getAflinkList(afChannel);
-//	}
-
-	/**
-	 * 색상그룹코드 RGB 목록
-	 *
-	 * @param
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	public Collection<CommonCode> getColorGrpCdRgbList() {
-		return rendererDao.getColorGrpCdRgbList();
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.style24.admin.biz.dao.TsaRendererDao;
+import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.DeliveryLoc;
+import com.style24.persistence.domain.Itemkind;
+import com.style24.persistence.domain.SupplyCompany;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 콤보박스, 체크박스, 라디오버튼 구성 시 필요한 Renderer Service
+ *
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@Service
+@Slf4j
+public class TsaRendererService {
+
+	@Autowired
+	private TsaRendererDao rendererDao;
+
+	/**
+	 * 연도 목록
+	 * @param startYear - 시작연도
+	 * @param startOffset - Start offset. 시작연도
+	 * @param endOffset - End offset. 종료연도
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 22.
+	 */
+	public Collection<CommonCode> getYearList(int startYear, int startOffset, int endOffset) {
+		Collection<CommonCode> yearList = new ArrayList<>();
+
+		int start = startYear + startOffset;
+		int end = startYear + endOffset;
+
+		for (int year = start; year <= end; year++) {
+			CommonCode commonCode = new CommonCode();
+
+			commonCode.setCd(String.valueOf(year));
+			commonCode.setCdNm(String.valueOf(year));
+
+			yearList.add(commonCode);
+		}
+
+		return yearList;
+	}
+
+	/**
+	 * 공급업체 목록
+	 * @param supplyCompany - 공급업체 정보
+	 * @return 공급업체 목록
+	 * @author Daehyoung
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getSupplyCompanyList(SupplyCompany supplyCompany) {
+		return rendererDao.getSupplyCompanyList(supplyCompany);
+	}
+
+	/**
+	 * 공급업체 목록
+	 * @return 공급업체 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getSupplyCompanyList() {
+		return this.getSupplyCompanyList(new SupplyCompany());
+	}
+
+	/**
+	 * 공급업체 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @return 공급업체 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getSupplyCompanyList(String supplyCompCd) {
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSupplyCompCd(supplyCompCd);
+		return this.getSupplyCompanyList(supplyCompany);
+	}
+
+	/**
+	 * 공급업체 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @param selfYn - 자사여부
+	 * @return 공급업체 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getSupplyCompanyList(String supplyCompCd, String selfYn) {
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSupplyCompCd(supplyCompCd);
+		supplyCompany.setSelfYn(selfYn);
+		return this.getSupplyCompanyList(supplyCompany);
+	}
+
+	/**
+	 * 자사공급업체 목록
+	 * @return 자사공급업체 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getSelfSupplyCompanyList() {
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSelfYn("Y");
+		return this.getSupplyCompanyList(supplyCompany);
+	}
+
+	/**
+	 * 입점공급업체 목록
+	 * @return 입점공급업체 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<CommonCode> getEntrSupplyCompanyList() {
+		SupplyCompany supplyCompany = new SupplyCompany();
+		supplyCompany.setSelfYn("N");
+		return this.getSupplyCompanyList(supplyCompany);
+	}
+
+	/**
+	 * 공통코드 목록 - 어드민 공통코드 캐시 미적용 - 상품등록시 시즌년도 캐쉬로 인한 정보 오류로 수정 2020.06.02
+	 * @param commoncode - 공통코드 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+//	@Cacheable(value = "common", key = "'commoncode-'.concat(#commoncode.cdGb)")
+	public Collection<CommonCode> getCommonCodeList(CommonCode commoncode) {
+		return rendererDao.getCommonCodeList(commoncode);
+	}
+
+	/**
+	 * 공통코드 목록
+	 * @param cdGb - 코드구분
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getCommonCodeList(String cdGb) {
+		CommonCode commoncode = new CommonCode();
+		commoncode.setCdGb(cdGb);
+		return this.getCommonCodeList(commoncode);
+	}
+
+	/**
+	 * 공통코드 목록
+	 * @param grpCodeId - 코드구분
+	 * @param useYn     - 사용여부
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getCommonCodeList(String cdGb, String useYn) {
+		CommonCode commoncode = new CommonCode();
+		commoncode.setCdGb(cdGb);
+		commoncode.setUseYn(useYn);
+		return this.getCommonCodeList(commoncode);
+	}
+
+	/**
+	 * 현재 유효한 공통코드 목록
+	 * @param cdGb - 코드구분
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getAvailCommonCodeList(String cdGb) {
+		return this.getCommonCodeList(cdGb, "Y");
+	}
+
+	/**
+	 * 공통코드 목록
+	 * @param cdGb   -코드구분
+	 * @param useYn  - 사용여부
+	 * @param cdDesc - 코드설명
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getCommonCodeList(String cdGb, String useYn, String cdDesc) {
+		CommonCode commoncode = new CommonCode();
+		commoncode.setCdGb(cdGb);
+		commoncode.setUseYn(useYn);
+		commoncode.setCdDesc(cdDesc);
+		return this.getCommonCodeList(commoncode);
+	}
+
+	/**
+	 * 공통코드 목록
+	 * @param cdGb      -코드구분
+	 * @param useYn     - 사용여부
+	 * @param exceptCds - 제외코드배열
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getCommonCodeList(String cdGb, String useYn, String[] exceptCds) {
+		CommonCode commoncode = new CommonCode();
+		commoncode.setCdGb(cdGb);
+		commoncode.setUseYn(useYn);
+		commoncode.setExceptCds(exceptCds);
+		return this.getCommonCodeList(commoncode);
+	}
+
+	/**
+	 * 최상위메뉴 목록
+	 * @param menuId - 메뉴ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getTopMenuList(String menuId) {
+		return rendererDao.getTopMenuList(menuId);
+	}
+
+	/**
+	 * 전체 메뉴 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getAllMenuList() {
+		return rendererDao.getAllMenuList();
+	}
+
+//	/**
+//	 * 벤더외부몰 목록
+//	 * @param vendorId - 벤더ID
+//	 * @return 벤더외부몰 목록
+//	 * @author gagamel
+//	 * @since 2019. 8. 11
+//	 */
+//	public Collection<CommonCode> getVendorExtmallList(String vendorId) {
+//		return rendererDao.getVendorExtmallList(vendorId);
+//	}
+//
+//	/**
+//	 * 벤더외부몰판매매장 목록
+//	 * @param vendorId - 벤더ID
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 4. 28
+//	 */
+//	public Collection<CommonCode> getVendorExtmallSellStoreList(String vendorId) {
+//		return rendererDao.getVendorExtmallSellStoreList(vendorId);
+//	}
+//
+//	//
+//	//	/**
+//	//	 * 유효한 브랜드 목록
+//	//	 * @param
+//	//	 * @return
+//	//	 * @author qkwlstktma
+//	//	 * @since 2019. 8. 25
+//	//	 */
+//	//	public Collection<CommonCode> getAvailableBrandList() {
+//	//		AdmBrand brand = new AdmBrand();
+//	//		brand.setUseYn("Y");
+//	//		return rendererDao.getBrandList(brand);
+//	//	}
+//	//
+	/**
+	 * 공급업체 브랜드 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @return
+	 * @author gagamel
+	 * @since 2019. 10. 20
+	 */
+	public Collection<CommonCode> getSupplyCompanyBrandList(String supplyCompCd) {
+		Brand brand = new Brand();
+		brand.setSupplyCompCd(supplyCompCd);
+		return rendererDao.getBrandList(brand);
+	}
+
+//
+//	/**
+//	 * 브랜드그룹별 브랜드 목록
+//	 * @param brandGrpNm - 브랜드그룹명
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 1. 10
+//	 */
+//	public Collection<CommonCode> getGroupBrandList(String brandGrpNm) {
+//		AdmBrand brand = new AdmBrand();
+//		brand.setBrandGrpNm(brandGrpNm);
+//		return rendererDao.getBrandList(brand);
+//	}
+//
+	/**
+	 * 권한별 브랜드 목록
+	 * @param adminId - 사용자ID
+	 * @return
+	 * @author eskim
+	 * @since 2019. 6. 17
+	 */
+	public Collection<CommonCode> getAuthBrandList(int userNo) {
+		return rendererDao.getAuthBrandList(userNo);
+	}
+
+	/**
+	 * 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return 출고처 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<CommonCode> getDeliveryLocList(DeliveryLoc delvLoc) {
+		return rendererDao.getDeliveryLocList(delvLoc);
+	}
+
+//	/**
+//	 * 출고처 목록
+//	 * @return 출고처 목록
+//	 * @author gagamel
+//	 * @since 2019. 12. 12
+//	 */
+//	public Collection<CommonCode> getDeliveryLocList() {
+//		AdmDeliveryLoc params = new AdmDeliveryLoc();
+//		return this.getDeliveryLocList(params);
+//	}
+
+	/**
+	 * 출고처 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @return 출고처 목록
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	public Collection<CommonCode> getDeliveryLocList(String supplyCompCd) {
+		DeliveryLoc delvLoc = new DeliveryLoc();
+		delvLoc.setSupplyCompCd(supplyCompCd);
+		return this.getDeliveryLocList(delvLoc);
+	}
+
+//	/**
+//	 * 직송매장 목록
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 5. 4
+//	 */
+//	public Collection<CommonCode> getDirectStoreList() {
+//		AdmDeliveryLoc params = new AdmDeliveryLoc();
+//		params.setDelvLocClsf("21"); // 직송매장
+//		return this.getDeliveryLocList(params);
+//	}
+//
+//	//	/**
+//	//	 * 정보고시 목록
+//	//	 * @param goodsCd - 상품코드
+//	//	 * @return
+//	//	 * @author jaewonHo
+//	//	 * @param supplyCompCd
+//	//	 * @since 2019. 10. 24
+//	//	 */
+//	//	public Collection<CommonCode> getCateInfoList(String goodsCd) {
+//	//		return rendererDao.getCateInfoList(goodsCd);
+//	//	}
+//
+	/**
+	 * 품목 목록
+	 * @return 품목 목록
+	 * @author eskim
+	 * @since 2020. 10. 19
+	 */
+	public Collection<CommonCode> getAllItemkindList() {
+		Itemkind itemkind = new Itemkind();
+		return this.getItemkindList(itemkind);
+	}
+
+	/**
+	 * 품목 목록
+	 * @param itemkind - 품목 정보
+	 * @return 품목 목록
+	 * @author eskim
+	 * @since 2020. 10. 19
+	 */
+	public Collection<CommonCode> getItemkindList(Itemkind itemkind) {
+		return rendererDao.getItemkindList(itemkind);
+	}
+
+//	/**
+//	 * 브랜드그룹 목록
+//	 * @return 브랜드그룹 목록
+//	 * @author eskim
+//	 * @since 2019. 12. 10
+//	 */
+//	public Collection<CommonCode> getBrandGroupList() {
+//		return rendererDao.getBrandGroupList();
+//	}
+//
+	/**
+	 * 컬러 목록
+	 * @param color - 색상 정보
+	 * @return 컬러 목록
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	public Collection<CommonCode> getColorList(Color color) {
+		return rendererDao.getColorList(color);
+	}
+
+//
+//	/**
+//	 * 사용중 대카테고리 목록
+//	 * @param cateGb - 카테고리구분
+//	 * @return 대카테고리 목록
+//	 * @author sasa004
+//	 * @since 2020. 01. 02
+//	 */
+//	public Collection<CommonCode> getTCategoryList(String cateGb) {
+//		return rendererDao.getTCategoryList(cateGb);
+//	}
+//
+	/**
+	 * 브랜드에 등록된 MD 목록
+	 * @return MD 목록
+	 * @author eskim
+	 * @since 2020. 10. 19
+	 */
+	public Collection<CommonCode> getBrandMdList() {
+		return rendererDao.getBrandMdList();
+	}
+
+	/**
+	 * 택배사명 목록 조회
+	 * @return CommonCode
+	 * @author moon
+	 * @since 2020. 11. 05
+	 */
+	public Collection<CommonCode> getShipCompanyList() {
+		return rendererDao.getShipCompanyList();
+	}
+//
+//	/**
+//	 * MD 별 브랜드 목록 조회
+//	 * @param mdId - 담당MD아이디
+//	 * @return CommonCode
+//	 * @author jaewonHo
+//	 * @since 2020. 02. 11
+//	 */
+//	public Collection<CommonCode> getMdBrandList(String mdId) {
+//		return rendererDao.getMdBrandList(mdId);
+//	}
+//
+//	/**
+//	 * MD 별 브랜드 목록 조회
+//	 * @param mdId - 담당MD아이디
+//	 * @return CommonCode
+//	 * @author jaewonHo
+//	 * @since 2020. 02. 11
+//	 */
+//	public Collection<CommonCode> getMdBrandGrpList(String mdId) {
+//		return rendererDao.getMdBrandGrpList(mdId);
+//	}
+//
+//	/**
+//	 * 인스타그램 계정리스트 조회
+//	 * @return
+//	 * @since : 2020. 3. 18.
+//	 * @authur 이명철
+//	 */
+//	public Collection<CommonCode> getInstaAccount() {
+//		return rendererDao.getInstaAccount();
+//	}
+//
+//	/**
+//	 * 판매몰조회
+//	 * @param
+//	 * @return CommonCode
+//	 * @author swkim
+//	 * @since 2020. 03. 19
+//	 */
+//	public Collection<CommonCode> getSellStoreList() {
+//		return rendererDao.getSellStoreList();
+//	}
+//
+//	/**
+//	 * 기본답변문구 제목 조회
+//	 * @param
+//	 * @return CommonCode
+//	 * @author yujing
+//	 * @since 2020. 04. 02
+//	 */
+//	public Collection<CommonCode> getBasicAnsTitleList(String ansClsf) {
+//		return rendererDao.getBasicAnsTitleList(ansClsf);
+//	}
+//
+//	/**
+//	 * 제휴링크 목록
+//	 * @param afChannel - 제휴채널
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 5. 4
+//	 */
+//	public Collection<CommonCode> getAflinkList(String afChannel) {
+//		return rendererDao.getAflinkList(afChannel);
+//	}
+
+	/**
+	 * 색상그룹코드 RGB 목록
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	public Collection<CommonCode> getColorGrpCdRgbList() {
+		return rendererDao.getColorGrpCdRgbList();
+	}
+
+}

+ 417 - 417
style24.admin/src/main/java/com/style24/admin/biz/service/TsaSystemService.java

@@ -1,417 +1,417 @@
-package com.style24.admin.biz.service;
-
-import java.util.Collection;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.style24.admin.biz.dao.TsaSystemDao;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.CommonCode;
-import com.style24.persistence.domain.Menu;
-import com.style24.persistence.domain.MenuRole;
-import com.style24.persistence.domain.SampleFile;
-import com.style24.persistence.domain.User;
-import com.style24.persistence.domain.UserHst;
-import com.style24.persistence.domain.UserMenu;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 시스템 Service
- *
- * @author gagamel
- * @since 2020. 10. 7
- */
-@Service
-@Slf4j
-public class TsaSystemService {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private TsaSystemDao systemDao;
-
-	/**
-	 * 사용자 목록
-	 * @param user - 사용자 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<User> getUserList(User user) {
-		return systemDao.getUserList(user);
-	}
-
-	/**
-	 * 사용자 목록 삭제 처리
-	 * @param userList - 사용자 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteUserList(Collection<User> userList) {
-		for (User user : userList) {
-			user.setUpdNo(TsaSession.getInfo().getUserNo());
-			systemDao.deleteUser(user);
-			this.deleteUserAccount(user); // 계정말소
-		}
-	}
-
-	/**
-	 * 사용자 정보 조회
-	 * @param userNo - 사용자번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public User getUser(Integer userNo) {
-		return systemDao.getUser(userNo);
-	}
-
-	/**
-	 * 사용자ID 건수 조회
-	 * @param userId - 사용자ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public int getUserIdCount(String userId) {
-		return systemDao.getUserIdCount(userId);
-	}
-
-	/**
-	 * 사용자 정보 저장 처리
-	 * @param user - 사용자 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@Transactional("shopTxnManager")
-	public void saveUser(User user) {
-		user.setRegNo(TsaSession.getInfo().getUserNo());
-		user.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		// 사용자 저장 처리
-		systemDao.saveUser(user);
-
-		// 등록된 사용자번호 값 가져오기
-		Integer userNo = user.getUserNo();
-		log.info("userNo: {}", userNo);
-		user.setUserNo(userNo);
-
-		if (user.getMode().equals("N")) {
-			this.createUserAccount(user); // 계정생성
-		} else if (user.getMode().equals("U")) {
-			if (user.getUseYn().equals("N")) {
-				this.deleteUserAccount(user); // 계정말소
-			} else {
-				this.restoreUserAccount(user); // 계정복원
-			}
-		}
-
-		// 권한이 변경되었으면
-		if (user.getRoleChangeYn().equals("Y")) {
-			// 사용자 전체메뉴 삭제
-			systemDao.deleteUserAllMenu(user.getUserNo());
-
-			// 사용자 전체메뉴 생성
-			systemDao.createUserAllMenu(user);
-
-			if (user.getMode().equals("U")) {
-				this.createUserRoleChange(user); // 권한변경
-			}
-		}
-	}
-
-	/**
-	 * 사용자정보변경이력 생성 - 계정생성
-	 * @param user - 사용자 정보
-	 * @author gagamel
-	 * @since 2020. 10. 8
-	 */
-	private void createUserAccount(User user) {
-		UserHst userHst = new UserHst();
-		userHst.setUserNo(user.getUserNo());
-		userHst.setChgGb("G049_10"); // 계정생성
-		userHst.setRegNo(TsaSession.getInfo().getUserNo());
-		systemDao.createUserInfoChangeHistory(userHst);
-	}
-
-	/**
-	 * 사용자정보변경이력 생성 - 계정말소
-	 * @param user - 사용자 정보
-	 * @author gagamel
-	 * @since 2020. 10. 8
-	 */
-	private void deleteUserAccount(User user) {
-		UserHst userHst = new UserHst();
-		userHst.setUserNo(user.getUserNo());
-		userHst.setChgGb("G049_11"); // 계정말소
-		userHst.setRegNo(TsaSession.getInfo().getUserNo());
-		systemDao.createUserInfoChangeHistory(userHst);
-	}
-
-	/**
-	 * 사용자정보변경이력 생성 - 계정복원
-	 * @param user - 사용자 정보
-	 * @author gagamel
-	 * @since 2020. 10. 8
-	 */
-	private void restoreUserAccount(User user) {
-		UserHst userHst = new UserHst();
-		userHst.setUserNo(user.getUserNo());
-		userHst.setChgGb("G049_12"); // 계정복원
-		userHst.setRegNo(TsaSession.getInfo().getUserNo());
-		systemDao.createUserInfoChangeHistory(userHst);
-	}
-
-	/**
-	 * 사용자정보변경이력 생성 - 권한변경
-	 * @param user - 사용자 정보
-	 * @author gagamel
-	 * @since 2020. 10. 8
-	 */
-	private void createUserRoleChange(User user) {
-		UserHst userHst = new UserHst();
-		userHst.setUserNo(user.getUserNo());
-		userHst.setChgGb("G049_20"); // 권한변경
-		userHst.setOrgRoleCd(TsaSession.getInfo().getRoleCd());
-		userHst.setRoleCd(user.getRoleCd());
-		userHst.setRegNo(TsaSession.getInfo().getUserNo());
-		systemDao.createUserInfoChangeHistory(userHst);
-	}
-
-	/**
-	 * 임시비밀번호 조회
-	 * @param length - 비밀번호 자릿수
-	 * @return 임시비밀번호
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public String getTemporaryPassword(int length) {
-		return systemDao.getTemporaryPassword(length);
-	}
-
-	/**
-	 * 사용자 비밀번호 수정
-	 * @param user - 사용자 정보
-	 * @since 2020. 10. 7
-	 */
-	public void updateUserPassword(User user) {
-		systemDao.updateUserPassword(user);
-
-		// 사용자정보변경이력 생성 - 비밀번호변경
-		UserHst userHst = new UserHst();
-		userHst.setUserNo(user.getUserNo());
-		userHst.setChgGb("G049_30"); // 비밀번호변경
-		userHst.setRegNo(TsaSession.getInfo().getUserNo());
-		systemDao.createUserInfoChangeHistory(userHst);
-	}
-
-	/**
-	 * 사용자 메뉴 목록
-	 * @param userNo - 사용자번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<UserMenu> getUserMenuList(Integer userNo) {
-		return systemDao.getUserMenuList(userNo);
-	}
-
-	/**
-	 * 사용자 메뉴 목록 저장 처리
-	 * @param userMenuList - 사용자 메뉴 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@Transactional("shopTxnManager")
-	public void saveUserMenuList(Collection<UserMenu> userMenuList) {
-		if (userMenuList == null || userMenuList.isEmpty())
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-
-		int cnt = 0;
-
-		for (UserMenu adminMenu : userMenuList) {
-			if (cnt++ == 0) {
-				// 사용자 전체메뉴 삭제
-				systemDao.deleteUserAllMenu(adminMenu.getUserNo());
-			}
-
-			adminMenu.setRegNo(TsaSession.getInfo().getUserNo());
-			adminMenu.setUpdNo(TsaSession.getInfo().getUserNo());
-
-			// 사용자 메뉴 생성
-			systemDao.createUserMenu(adminMenu);
-		}
-	}
-
-	/**
-	 * 메뉴 목록
-	 * @param pmenuId - 상위메뉴ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<Menu> getMenuList(String pmenuId) {
-		Menu menu = new Menu();
-		menu.setPmenuId(pmenuId);
-		return systemDao.getMenuList(menu);
-	}
-
-	/**
-	 * 메뉴 목록 저장 처리
-	 * @param menuList - 메뉴 목록
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@Transactional("shopTxnManager")
-	public void saveMenuList(Collection<Menu> menuList) {
-		if (menuList == null || menuList.isEmpty())
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-
-		for (Menu menu : menuList) {
-			menu.setRegNo(TsaSession.getInfo().getUserNo());
-			menu.setUpdNo(TsaSession.getInfo().getUserNo());
-			systemDao.saveMenu(menu);
-		}
-	}
-
-	/**
-	 * 메뉴 등록/수정 및 메뉴권한 생성
-	 * @param menu - 메뉴 정보
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@Transactional("shopTxnManager")
-//	@CacheEvict(value = "menu", allEntries = true)
-	public void saveMenu(Menu menu) {
-		menu.setRegNo(TsaSession.getInfo().getUserNo());
-		menu.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		// 메뉴 등록/수정
-		systemDao.saveMenu(menu);
-
-		if (StringUtils.isNotBlank(menu.getRoleCds())) {
-			// 메뉴권한 삭제
-			systemDao.deleteMenuRole(menu.getMenuId());
-
-			String[] roleCds = menu.getRoleCds().split(",");
-
-			for (String roleCd : roleCds) {
-				MenuRole menuRole = new MenuRole();
-				menuRole.setRoleCd(roleCd);
-				menuRole.setMenuId(menu.getMenuId());
-				menuRole.setRegNo(TsaSession.getInfo().getUserNo());
-				menuRole.setUpdNo(TsaSession.getInfo().getUserNo());
-
-				// 메뉴권한 생성
-				systemDao.createMenuRole(menuRole);
-
-				// 전체 어드민사용자 메뉴 생성
-				systemDao.deleteAllUserMenu(menuRole);
-
-				// 전체 어드민사용자 메뉴 생성
-				systemDao.createAllUserMenu(menuRole);
-			}
-		}
-	}
-
-	/**
-	 * 공통코드 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getCommonCodeList() {
-		return this.getCommonCodeList(new CommonCode());
-	}
-
-	/**
-	 * 공통코드 목록
-	 * @param commoncode - 공통코드 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	public Collection<CommonCode> getCommonCodeList(CommonCode commoncode) {
-		return systemDao.getCommonCodeList(commoncode);
-	}
-
-	/**
-	 * 공통코드 목록 저장 처리
-	 * @param dataList - 공통코드 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@Transactional("shopTxnManager")
-	public void saveCommonCodeList(Collection<CommonCode> dataList) {
-		if (dataList == null || dataList.isEmpty())
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-
-		for (CommonCode commoncode : dataList) {
-			commoncode.setRegNo(TsaSession.getInfo().getUserNo());
-			commoncode.setUpdNo(TsaSession.getInfo().getUserNo());
-			commoncode.setCdNm(commoncode.getCdNm().replace("&gt;", ">"));
-			systemDao.saveCommonCode(commoncode);
-		}
-	}
-
-	/**
-	 * 공통코드 저장 처리
-	 * @param commoncode - 공통코드 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@Transactional("shopTxnManager")
-	public void saveCommonCode(CommonCode commoncode) {
-		commoncode.setRegNo(TsaSession.getInfo().getUserNo());
-		commoncode.setUpdNo(TsaSession.getInfo().getUserNo());
-		commoncode.setCdNm(commoncode.getCdNm().replace("&gt;", ">"));
-		systemDao.saveCommonCode(commoncode);
-	}
-
-	/**
-	 * 공통코드 삭제처리
-	 * @param commoncode - 공통코드 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@Transactional("shopTxnManager")
-	public void deleteCommonCode(CommonCode commoncode) {
-		systemDao.deleteCommonCode(commoncode);
-	}
-
-	/**
-	 * 샘플파일 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	public Collection<SampleFile> getSampleFileList() {
-		return systemDao.getSampleFileList();
-	}
-
-	/**
-	 * 샘플파일 등록/수정
-	 * @param sampleFile - 샘플파일 정보
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@Transactional("shopTxnManager")
-	public void saveSampleFile(SampleFile sampleFile) {
-		if (sampleFile.getMode().equals("N")) {
-			systemDao.createSampleFile(sampleFile);
-		} else {
-			systemDao.updateSampleFile(sampleFile);
-		}
-	}
-
-}
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaSystemDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.Menu;
+import com.style24.persistence.domain.MenuRole;
+import com.style24.persistence.domain.SampleFile;
+import com.style24.persistence.domain.User;
+import com.style24.persistence.domain.UserHst;
+import com.style24.persistence.domain.UserMenu;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 시스템 Service
+ *
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@Service
+@Slf4j
+public class TsaSystemService {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaSystemDao systemDao;
+
+	/**
+	 * 사용자 목록
+	 * @param user - 사용자 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<User> getUserList(User user) {
+		return systemDao.getUserList(user);
+	}
+
+	/**
+	 * 사용자 목록 삭제 처리
+	 * @param userList - 사용자 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteUserList(Collection<User> userList) {
+		for (User user : userList) {
+			user.setUpdNo(TsaSession.getInfo().getUserNo());
+			systemDao.deleteUser(user);
+			this.deleteUserAccount(user); // 계정말소
+		}
+	}
+
+	/**
+	 * 사용자 정보 조회
+	 * @param userNo - 사용자번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public User getUser(Integer userNo) {
+		return systemDao.getUser(userNo);
+	}
+
+	/**
+	 * 사용자ID 건수 조회
+	 * @param userId - 사용자ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public int getUserIdCount(String userId) {
+		return systemDao.getUserIdCount(userId);
+	}
+
+	/**
+	 * 사용자 정보 저장 처리
+	 * @param user - 사용자 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@Transactional("shopTxnManager")
+	public void saveUser(User user) {
+		user.setRegNo(TsaSession.getInfo().getUserNo());
+		user.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		// 사용자 저장 처리
+		systemDao.saveUser(user);
+
+		// 등록된 사용자번호 값 가져오기
+		Integer userNo = user.getUserNo();
+		log.info("userNo: {}", userNo);
+		user.setUserNo(userNo);
+
+		if (user.getMode().equals("N")) {
+			this.createUserAccount(user); // 계정생성
+		} else if (user.getMode().equals("U")) {
+			if (user.getUseYn().equals("N")) {
+				this.deleteUserAccount(user); // 계정말소
+			} else {
+				this.restoreUserAccount(user); // 계정복원
+			}
+		}
+
+		// 권한이 변경되었으면
+		if (user.getRoleChangeYn().equals("Y")) {
+			// 사용자 전체메뉴 삭제
+			systemDao.deleteUserAllMenu(user.getUserNo());
+
+			// 사용자 전체메뉴 생성
+			systemDao.createUserAllMenu(user);
+
+			if (user.getMode().equals("U")) {
+				this.createUserRoleChange(user); // 권한변경
+			}
+		}
+	}
+
+	/**
+	 * 사용자정보변경이력 생성 - 계정생성
+	 * @param user - 사용자 정보
+	 * @author gagamel
+	 * @since 2020. 10. 8
+	 */
+	private void createUserAccount(User user) {
+		UserHst userHst = new UserHst();
+		userHst.setUserNo(user.getUserNo());
+		userHst.setChgGb("G049_10"); // 계정생성
+		userHst.setRegNo(TsaSession.getInfo().getUserNo());
+		systemDao.createUserInfoChangeHistory(userHst);
+	}
+
+	/**
+	 * 사용자정보변경이력 생성 - 계정말소
+	 * @param user - 사용자 정보
+	 * @author gagamel
+	 * @since 2020. 10. 8
+	 */
+	private void deleteUserAccount(User user) {
+		UserHst userHst = new UserHst();
+		userHst.setUserNo(user.getUserNo());
+		userHst.setChgGb("G049_11"); // 계정말소
+		userHst.setRegNo(TsaSession.getInfo().getUserNo());
+		systemDao.createUserInfoChangeHistory(userHst);
+	}
+
+	/**
+	 * 사용자정보변경이력 생성 - 계정복원
+	 * @param user - 사용자 정보
+	 * @author gagamel
+	 * @since 2020. 10. 8
+	 */
+	private void restoreUserAccount(User user) {
+		UserHst userHst = new UserHst();
+		userHst.setUserNo(user.getUserNo());
+		userHst.setChgGb("G049_12"); // 계정복원
+		userHst.setRegNo(TsaSession.getInfo().getUserNo());
+		systemDao.createUserInfoChangeHistory(userHst);
+	}
+
+	/**
+	 * 사용자정보변경이력 생성 - 권한변경
+	 * @param user - 사용자 정보
+	 * @author gagamel
+	 * @since 2020. 10. 8
+	 */
+	private void createUserRoleChange(User user) {
+		UserHst userHst = new UserHst();
+		userHst.setUserNo(user.getUserNo());
+		userHst.setChgGb("G049_20"); // 권한변경
+		userHst.setOrgRoleCd(TsaSession.getInfo().getRoleCd());
+		userHst.setRoleCd(user.getRoleCd());
+		userHst.setRegNo(TsaSession.getInfo().getUserNo());
+		systemDao.createUserInfoChangeHistory(userHst);
+	}
+
+	/**
+	 * 임시비밀번호 조회
+	 * @param length - 비밀번호 자릿수
+	 * @return 임시비밀번호
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public String getTemporaryPassword(int length) {
+		return systemDao.getTemporaryPassword(length);
+	}
+
+	/**
+	 * 사용자 비밀번호 수정
+	 * @param user - 사용자 정보
+	 * @since 2020. 10. 7
+	 */
+	public void updateUserPassword(User user) {
+		systemDao.updateUserPassword(user);
+
+		// 사용자정보변경이력 생성 - 비밀번호변경
+		UserHst userHst = new UserHst();
+		userHst.setUserNo(user.getUserNo());
+		userHst.setChgGb("G049_30"); // 비밀번호변경
+		userHst.setRegNo(TsaSession.getInfo().getUserNo());
+		systemDao.createUserInfoChangeHistory(userHst);
+	}
+
+	/**
+	 * 사용자 메뉴 목록
+	 * @param userNo - 사용자번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<UserMenu> getUserMenuList(Integer userNo) {
+		return systemDao.getUserMenuList(userNo);
+	}
+
+	/**
+	 * 사용자 메뉴 목록 저장 처리
+	 * @param userMenuList - 사용자 메뉴 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@Transactional("shopTxnManager")
+	public void saveUserMenuList(Collection<UserMenu> userMenuList) {
+		if (userMenuList == null || userMenuList.isEmpty())
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+
+		int cnt = 0;
+
+		for (UserMenu adminMenu : userMenuList) {
+			if (cnt++ == 0) {
+				// 사용자 전체메뉴 삭제
+				systemDao.deleteUserAllMenu(adminMenu.getUserNo());
+			}
+
+			adminMenu.setRegNo(TsaSession.getInfo().getUserNo());
+			adminMenu.setUpdNo(TsaSession.getInfo().getUserNo());
+
+			// 사용자 메뉴 생성
+			systemDao.createUserMenu(adminMenu);
+		}
+	}
+
+	/**
+	 * 메뉴 목록
+	 * @param pmenuId - 상위메뉴ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<Menu> getMenuList(String pmenuId) {
+		Menu menu = new Menu();
+		menu.setPmenuId(pmenuId);
+		return systemDao.getMenuList(menu);
+	}
+
+	/**
+	 * 메뉴 목록 저장 처리
+	 * @param menuList - 메뉴 목록
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@Transactional("shopTxnManager")
+	public void saveMenuList(Collection<Menu> menuList) {
+		if (menuList == null || menuList.isEmpty())
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+
+		for (Menu menu : menuList) {
+			menu.setRegNo(TsaSession.getInfo().getUserNo());
+			menu.setUpdNo(TsaSession.getInfo().getUserNo());
+			systemDao.saveMenu(menu);
+		}
+	}
+
+	/**
+	 * 메뉴 등록/수정 및 메뉴권한 생성
+	 * @param menu - 메뉴 정보
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@Transactional("shopTxnManager")
+//	@CacheEvict(value = "menu", allEntries = true)
+	public void saveMenu(Menu menu) {
+		menu.setRegNo(TsaSession.getInfo().getUserNo());
+		menu.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		// 메뉴 등록/수정
+		systemDao.saveMenu(menu);
+
+		if (StringUtils.isNotBlank(menu.getRoleCds())) {
+			// 메뉴권한 삭제
+			systemDao.deleteMenuRole(menu.getMenuId());
+
+			String[] roleCds = menu.getRoleCds().split(",");
+
+			for (String roleCd : roleCds) {
+				MenuRole menuRole = new MenuRole();
+				menuRole.setRoleCd(roleCd);
+				menuRole.setMenuId(menu.getMenuId());
+				menuRole.setRegNo(TsaSession.getInfo().getUserNo());
+				menuRole.setUpdNo(TsaSession.getInfo().getUserNo());
+
+				// 메뉴권한 생성
+				systemDao.createMenuRole(menuRole);
+
+				// 전체 어드민사용자 메뉴 생성
+				systemDao.deleteAllUserMenu(menuRole);
+
+				// 전체 어드민사용자 메뉴 생성
+				systemDao.createAllUserMenu(menuRole);
+			}
+		}
+	}
+
+	/**
+	 * 공통코드 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getCommonCodeList() {
+		return this.getCommonCodeList(new CommonCode());
+	}
+
+	/**
+	 * 공통코드 목록
+	 * @param commoncode - 공통코드 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	public Collection<CommonCode> getCommonCodeList(CommonCode commoncode) {
+		return systemDao.getCommonCodeList(commoncode);
+	}
+
+	/**
+	 * 공통코드 목록 저장 처리
+	 * @param dataList - 공통코드 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@Transactional("shopTxnManager")
+	public void saveCommonCodeList(Collection<CommonCode> dataList) {
+		if (dataList == null || dataList.isEmpty())
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+
+		for (CommonCode commoncode : dataList) {
+			commoncode.setRegNo(TsaSession.getInfo().getUserNo());
+			commoncode.setUpdNo(TsaSession.getInfo().getUserNo());
+			commoncode.setCdNm(commoncode.getCdNm().replace("&gt;", ">"));
+			systemDao.saveCommonCode(commoncode);
+		}
+	}
+
+	/**
+	 * 공통코드 저장 처리
+	 * @param commoncode - 공통코드 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@Transactional("shopTxnManager")
+	public void saveCommonCode(CommonCode commoncode) {
+		commoncode.setRegNo(TsaSession.getInfo().getUserNo());
+		commoncode.setUpdNo(TsaSession.getInfo().getUserNo());
+		commoncode.setCdNm(commoncode.getCdNm().replace("&gt;", ">"));
+		systemDao.saveCommonCode(commoncode);
+	}
+
+	/**
+	 * 공통코드 삭제처리
+	 * @param commoncode - 공통코드 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteCommonCode(CommonCode commoncode) {
+		systemDao.deleteCommonCode(commoncode);
+	}
+
+	/**
+	 * 샘플파일 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	public Collection<SampleFile> getSampleFileList() {
+		return systemDao.getSampleFileList();
+	}
+
+	/**
+	 * 샘플파일 등록/수정
+	 * @param sampleFile - 샘플파일 정보
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@Transactional("shopTxnManager")
+	public void saveSampleFile(SampleFile sampleFile) {
+		if (sampleFile.getMode().equals("N")) {
+			systemDao.createSampleFile(sampleFile);
+		} else {
+			systemDao.updateSampleFile(sampleFile);
+		}
+	}
+
+}

+ 242 - 242
style24.admin/src/main/java/com/style24/admin/biz/web/TsaBoardController.java

@@ -1,242 +1,242 @@
-package com.style24.admin.biz.web;
-
-import java.io.IOException;
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import com.style24.admin.biz.service.TsaFaqService;
-import com.style24.admin.biz.service.TsaNoticeService;
-import com.style24.admin.biz.service.TsaRendererService;
-import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.admin.support.env.TsaConstants;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Faq;
-import com.style24.persistence.domain.Notice;
-
-import lombok.extern.slf4j.Slf4j;
-
-import com.gagaframework.web.rest.server.GagaResponse;
-import com.gagaframework.web.util.GagaFileUtil;
-
-/**
- * 게시판 Controller
- *
- * @author gagamel
- * @since 2020. 10. 30
- */
-@Controller
-@RequestMapping("/board")
-@Slf4j
-public class TsaBoardController extends TsaBaseController {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private TsaNoticeService noticeService;
-
-	@Autowired
-	private TsaRendererService rendererService;
-
-	@Value("${upload.default.target.path}")
-	private String uploadTargetPath;
-
-	@Autowired
-	private TsaFaqService faqService;
-
-	/**
-	 * 공지사항 화면
-	 * @param noticeType - 공지유형(10:사이트공지, 20:내부공지)
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	@GetMapping("/notice/form/{noticeType}")
-	public ModelAndView noticeForm(@PathVariable String noticeType) {
-		ModelAndView mav = new ModelAndView();
-
-		// 공지유형
-		mav.addObject("noticeType", noticeType);
-
-		// 수신자 목록
-		// 공지유형이 "10:사이트공지"일 때는 사이트 목록
-		// 공지유형이 "20:내부공지"일 때는 공지수신자-조직 목록
-		if (noticeType.equals(TsaConstants.NoticeType.SITE.value())) {
-			mav.addObject("noticeReceiverList", rendererService.getAvailCommonCodeList("G000"));
-		} else if (noticeType.equals(TsaConstants.NoticeType.INNER.value())) {
-			mav.addObject("noticeReceiverList", rendererService.getAvailCommonCodeList("G048"));
-		}
-
-		mav.setViewName("board/NoticeForm");
-
-		return mav;
-	}
-
-	/**
-	 * 사이트 공지 목록
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	@PostMapping("/notice/list")
-	@ResponseBody
-	public Collection<Notice> getNoticeList(@RequestBody Notice notice) {
-		return noticeService.getNoticeList(notice);
-	}
-
-	/**
-	 * 공지사항 수신자 목록
-	 * @param noticeSq - 공지사항일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	@GetMapping("/notice/receiver/list/{noticeSq}")
-	@ResponseBody
-	public Collection<Notice> getNoticeReceiverList(@PathVariable Integer noticeSq) {
-		return noticeService.getNoticeReceiverList(noticeSq);
-	}
-
-	/**
-	 * 공지사항 파일목록 조회
-	 * @param noticeSq - 공지사항일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	@GetMapping("/notice/file/list/{noticeSq}")
-	@ResponseBody
-	public Collection<Notice> getNoticeFileList(@PathVariable Integer noticeSq) {
-		return noticeService.getNoticeFileList(noticeSq);
-	}
-
-	/**
-	 * 공지사항 저장
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	@PostMapping("/notice/save")
-	@ResponseBody
-	public GagaResponse saveNotice(@RequestBody Notice notice) {
-		noticeService.saveNotice(notice);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 첨부파일 삭제
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @throws IOException
-	 * @author gagamel
-	 * @since 2020. 3. 24
-	 */
-	@PostMapping("/notice/file/delete")
-	@ResponseBody
-	public GagaResponse deleteNoticeFile(@RequestBody Notice notice) throws IOException {
-		// 파일 삭제
-		String fileName = GagaFileUtil.getConcatenationPath(uploadTargetPath, "board", notice.getSysFileNm());
-
-		GagaFileUtil.deleteFile(fileName);
-
-		// 삭제된 파일 DB 처리
-		noticeService.deleteNoticeFile(notice);
-
-		return super.ok(message.getMessage("SUCC_0003"));
-	}
-
-	/**
-	 * FAQ 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@GetMapping("/faq/form")
-	public ModelAndView faqForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 사이트
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-
-		// FAQ유형
-		mav.addObject("faqTypeList", rendererService.getAvailCommonCodeList("G046"));
-
-		mav.setViewName("board/FaqForm");
-
-		return mav;
-	}
-
-	/**
-	 * FAQ 목록
-	 * @param faq - FAQ 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@PostMapping("/faq/list")
-	@ResponseBody
-	public Collection<Faq> getFaqList(@RequestBody Faq faq) {
-		return faqService.getFaqList(faq);
-	}
-
-	/**
-	 * FAQ 등록/수정
-	 * @param faq - FAQ 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@PostMapping("/faq/save")
-	@ResponseBody
-	public GagaResponse saveFaq(@RequestBody Faq faq) {
-		faq.setRegNo(TsaSession.getInfo().getUserNo());
-		faq.setUpdNo(TsaSession.getInfo().getUserNo());
-		faqService.saveFaq(faq);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * FAQ 상세
-	 * @param mode - 모드(N:신규, U:상세)
-	 * @param faqSq - FAQ일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@GetMapping("/faq/detail/form")
-	public ModelAndView faqDetailForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "faqSq", required = false) Integer faqSq) {
-		ModelAndView mav = new ModelAndView();
-
-		// 사이트
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-
-		// FAQ유형
-		mav.addObject("faqTypeList", rendererService.getAvailCommonCodeList("G046"));
-
-		// 모드 값
-		mav.addObject("mode", mode);
-
-		if ("U".equals(mode)) {
-			mav.addObject("faqInfo", faqService.getFaq(faqSq));
-		}
-
-		mav.setViewName("board/FaqDetailForm");
-
-		return mav;
-	}
-
-}
+package com.style24.admin.biz.web;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.admin.biz.service.TsaFaqService;
+import com.style24.admin.biz.service.TsaNoticeService;
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.admin.support.env.TsaConstants;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Faq;
+import com.style24.persistence.domain.Notice;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.util.GagaFileUtil;
+
+/**
+ * 게시판 Controller
+ *
+ * @author gagamel
+ * @since 2020. 10. 30
+ */
+@Controller
+@RequestMapping("/board")
+@Slf4j
+public class TsaBoardController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaNoticeService noticeService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Value("${upload.default.target.path}")
+	private String uploadTargetPath;
+
+	@Autowired
+	private TsaFaqService faqService;
+
+	/**
+	 * 공지사항 화면
+	 * @param noticeType - 공지유형(10:사이트공지, 20:내부공지)
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	@GetMapping("/notice/form/{noticeType}")
+	public ModelAndView noticeForm(@PathVariable String noticeType) {
+		ModelAndView mav = new ModelAndView();
+
+		// 공지유형
+		mav.addObject("noticeType", noticeType);
+
+		// 수신자 목록
+		// 공지유형이 "10:사이트공지"일 때는 사이트 목록
+		// 공지유형이 "20:내부공지"일 때는 공지수신자-조직 목록
+		if (noticeType.equals(TsaConstants.NoticeType.SITE.value())) {
+			mav.addObject("noticeReceiverList", rendererService.getAvailCommonCodeList("G000"));
+		} else if (noticeType.equals(TsaConstants.NoticeType.INNER.value())) {
+			mav.addObject("noticeReceiverList", rendererService.getAvailCommonCodeList("G048"));
+		}
+
+		mav.setViewName("board/NoticeForm");
+
+		return mav;
+	}
+
+	/**
+	 * 사이트 공지 목록
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	@PostMapping("/notice/list")
+	@ResponseBody
+	public Collection<Notice> getNoticeList(@RequestBody Notice notice) {
+		return noticeService.getNoticeList(notice);
+	}
+
+	/**
+	 * 공지사항 수신자 목록
+	 * @param noticeSq - 공지사항일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	@GetMapping("/notice/receiver/list/{noticeSq}")
+	@ResponseBody
+	public Collection<Notice> getNoticeReceiverList(@PathVariable Integer noticeSq) {
+		return noticeService.getNoticeReceiverList(noticeSq);
+	}
+
+	/**
+	 * 공지사항 파일목록 조회
+	 * @param noticeSq - 공지사항일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	@GetMapping("/notice/file/list/{noticeSq}")
+	@ResponseBody
+	public Collection<Notice> getNoticeFileList(@PathVariable Integer noticeSq) {
+		return noticeService.getNoticeFileList(noticeSq);
+	}
+
+	/**
+	 * 공지사항 저장
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	@PostMapping("/notice/save")
+	@ResponseBody
+	public GagaResponse saveNotice(@RequestBody Notice notice) {
+		noticeService.saveNotice(notice);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 첨부파일 삭제
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @throws IOException
+	 * @author gagamel
+	 * @since 2020. 3. 24
+	 */
+	@PostMapping("/notice/file/delete")
+	@ResponseBody
+	public GagaResponse deleteNoticeFile(@RequestBody Notice notice) throws IOException {
+		// 파일 삭제
+		String fileName = GagaFileUtil.getConcatenationPath(uploadTargetPath, "board", notice.getSysFileNm());
+
+		GagaFileUtil.deleteFile(fileName);
+
+		// 삭제된 파일 DB 처리
+		noticeService.deleteNoticeFile(notice);
+
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * FAQ 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@GetMapping("/faq/form")
+	public ModelAndView faqForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// FAQ유형
+		mav.addObject("faqTypeList", rendererService.getAvailCommonCodeList("G046"));
+
+		mav.setViewName("board/FaqForm");
+
+		return mav;
+	}
+
+	/**
+	 * FAQ 목록
+	 * @param faq - FAQ 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@PostMapping("/faq/list")
+	@ResponseBody
+	public Collection<Faq> getFaqList(@RequestBody Faq faq) {
+		return faqService.getFaqList(faq);
+	}
+
+	/**
+	 * FAQ 등록/수정
+	 * @param faq - FAQ 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@PostMapping("/faq/save")
+	@ResponseBody
+	public GagaResponse saveFaq(@RequestBody Faq faq) {
+		faq.setRegNo(TsaSession.getInfo().getUserNo());
+		faq.setUpdNo(TsaSession.getInfo().getUserNo());
+		faqService.saveFaq(faq);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * FAQ 상세
+	 * @param mode - 모드(N:신규, U:상세)
+	 * @param faqSq - FAQ일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@GetMapping("/faq/detail/form")
+	public ModelAndView faqDetailForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "faqSq", required = false) Integer faqSq) {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// FAQ유형
+		mav.addObject("faqTypeList", rendererService.getAvailCommonCodeList("G046"));
+
+		// 모드 값
+		mav.addObject("mode", mode);
+
+		if ("U".equals(mode)) {
+			mav.addObject("faqInfo", faqService.getFaq(faqSq));
+		}
+
+		mav.setViewName("board/FaqDetailForm");
+
+		return mav;
+	}
+
+}

+ 571 - 571
style24.admin/src/main/java/com/style24/admin/biz/web/TsaBusinessController.java

@@ -1,571 +1,571 @@
-package com.style24.admin.biz.web;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import com.style24.admin.biz.service.TsaBusinessService;
-import com.style24.admin.biz.service.TsaRendererService;
-import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.biz.service.TscEnvsetService;
-import com.style24.core.support.env.TscConstants;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Aflink;
-import com.style24.persistence.domain.Brand;
-import com.style24.persistence.domain.BrandMd;
-import com.style24.persistence.domain.DeliveryLoc;
-import com.style24.persistence.domain.SellStore;
-import com.style24.persistence.domain.ShipCompany;
-import com.style24.persistence.domain.SiteBrand;
-import com.style24.persistence.domain.StockSyncBase;
-import com.style24.persistence.domain.SupplyCompany;
-
-import lombok.extern.slf4j.Slf4j;
-
-import com.gagaframework.web.rest.server.GagaResponse;
-
-/**
- * 영업관리 Controller
- *
- * @author gagamel
- * @since 2020. 10. 14
- */
-@Controller
-@RequestMapping("/business")
-@Slf4j
-public class TsaBusinessController extends TsaBaseController {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private TsaBusinessService businessService;
-
-	@Autowired
-	private TsaRendererService rendererService;
-
-	@Autowired
-	private TscEnvsetService cenvsetService;
-
-	/**
-	 * 공급업체관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 14
-	 */
-	@GetMapping("/supply/company/form")
-	public ModelAndView supplyCompanyForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 입점상태
-		mav.addObject("supplyStatList", rendererService.getAvailCommonCodeList("G010"));
-
-		// 유통구분
-		mav.addObject("distributionGbList", rendererService.getAvailCommonCodeList("G065"));
-
-		// 은행
-		mav.addObject("bankList", rendererService.getAvailCommonCodeList("G940"));
-
-		// 정산일
-		mav.addObject("settleDayList", rendererService.getAvailCommonCodeList("G075"));
-
-		mav.setViewName("business/SupplyCompanyForm");
-
-		return mav;
-	}
-
-	/**
-	 * 공급업체관리 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 14
-	 */
-	@PostMapping("/supply/company/list")
-	@ResponseBody
-	public Collection<SupplyCompany> getCompanyList(@RequestBody SupplyCompany supplyComp) {
-		return businessService.getSupplyCompanyList(supplyComp);
-	}
-
-	/**
-	 * 공급업체관리 저장 처리
-	 * @param supplyComp - 공급업체 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 14
-	 */
-	@PostMapping("/supply/company/save")
-	@ResponseBody
-	public GagaResponse saveSupplyInfo(@RequestBody SupplyCompany supplyComp) {
-		supplyComp.setRegNo(TsaSession.getInfo().getUserNo());
-		supplyComp.setUpdNo(TsaSession.getInfo().getUserNo());
-
-		businessService.saveSupplyCompany(supplyComp);
-
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 공급업체출고처관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 16
-	 **/
-	@GetMapping("/supply/company/delvloc/form")
-	public ModelAndView deliveryLocForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		// 출고처분류
-		mav.addObject("delvLocClsfList", rendererService.getAvailCommonCodeList("G024"));
-
-		// 송장출력형태
-		mav.addObject("invoicePrintTypeList", rendererService.getAvailCommonCodeList("G025"));
-
-		mav.setViewName("business/DeliveryLocForm");
-
-		return mav;
-	}
-
-	/**
-	 * 공급업체출고처 목록
-	 * @param delvLoc - 출고처 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 16
-	 **/
-	@PostMapping("/supply/company/delvloc/list")
-	@ResponseBody
-	public Collection<DeliveryLoc> getDeliveryLocList(@RequestBody DeliveryLoc delvLoc) {
-		return businessService.getDeliveryLocList(delvLoc);
-	}
-
-	/**
-	 * 공급업체출고처 저장 처리
-	 * @param delvLoc - 출고처 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 16
-	 */
-	@PostMapping("/supply/company/delvloc/save")
-	@ResponseBody
-	public GagaResponse saveDeliveryLoc(@RequestBody DeliveryLoc delvLoc) {
-		delvLoc.setRegNo(TsaSession.getInfo().getUserNo());
-		delvLoc.setUpdNo(TsaSession.getInfo().getUserNo());
-		businessService.saveDeliveryLoc(delvLoc);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 브랜드관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@GetMapping("/brand/form")
-	public ModelAndView supplyCompanyBrandForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		// 유통구분
-		mav.addObject("distributionGbList", rendererService.getAvailCommonCodeList("G065"));
-
-		// 사이트
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-
-		// 구매적립포인트율
-		mav.addObject("pntInfo", cenvsetService.getEnvset(TscConstants.Site.STYLE24.value(), "C15"));
-
-		mav.setViewName("business/BrandForm");
-
-		return mav;
-	}
-
-	/**
-	 * 브랜드 목록
-	 * @param brand - 브랜드 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@PostMapping("/brand/list")
-	@ResponseBody
-	public Collection<Brand> getBrandList(@RequestBody Brand brand) {
-		return businessService.getBrandList(brand);
-	}
-
-	/**
-	 * 담당MD 목록 화면
-	 * @param brandMd - 담당MD 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@GetMapping("/md/list/form")
-	public ModelAndView mdListForm(BrandMd brandMd) {
-		ModelAndView mav = new ModelAndView();
-
-		mav.addObject("params", brandMd);
-
-		mav.setViewName("business/MdListForm");
-
-		return mav;
-	}
-
-	/**
-	 * 브랜드담당MD 목록
-	 * @param brandCd - 브랜드코드
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@PostMapping("/md/list")
-	@ResponseBody
-	public Collection<BrandMd> getMdList(@RequestBody BrandMd brandMd) {
-		return businessService.getMdList(brandMd);
-	}
-
-	/**
-	 * 브랜드담당MD 목록
-	 * @param brandCd - 브랜드코드
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@GetMapping("/brand/md/list/{brandCd}")
-	@ResponseBody
-	public Collection<BrandMd> getBrandMdList(@PathVariable String brandCd) {
-		return businessService.getBrandMdList(brandCd);
-	}
-
-	/**
-	 * 브랜드 담당MD 등록/수정 처리
-	 * @param brandMdList - 브랜드담당MD 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@PostMapping("/brand/md/list/save")
-	@ResponseBody
-	public GagaResponse saveBrandMdList(@RequestBody Collection<BrandMd> brandMdList) {
-		if (brandMdList == null || brandMdList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		businessService.saveBrandMdList(brandMdList);
-
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 브랜드 노출사이트 목록
-	 * @param brandCd - 브랜드코드
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@GetMapping("/brand/site/list/{brandCd}")
-	@ResponseBody
-	public Collection<SiteBrand> getBrandSiteList(@PathVariable String brandCd) {
-		return businessService.getBrandSiteList(brandCd);
-	}
-
-	/**
-	 * 브랜드 노출사이트 등록/수정 처리
-	 * @param brandSiteList - 브랜드사이트 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@PostMapping("/brand/site/list/save")
-	@ResponseBody
-	public GagaResponse saveBrandSiteList(@RequestBody Collection<SiteBrand> brandSiteList) {
-		if (brandSiteList == null || brandSiteList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		businessService.saveBrandSiteList(brandSiteList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 브랜드 등록/수정 처리
-	 * @param brand - 브랜드 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	@PostMapping("/brand/save")
-	@ResponseBody
-	public GagaResponse saveBrand(@RequestBody Brand brand) {
-		brand.setRegNo(TsaSession.getInfo().getUserNo());
-		brand.setUpdNo(TsaSession.getInfo().getUserNo());
-		businessService.saveBrand(brand);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 재고연계관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	@GetMapping("/stock/sync/form")
-	public ModelAndView stockSyncForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 자사공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd(), "Y"));
-
-		// 출고처 분류
-		String[] exceptCds = {"G024_20", "G024_30"};
-		mav.addObject("delvLocClsfList", rendererService.getCommonCodeList("G024", "Y", exceptCds));
-
-		// 정상이월구분
-		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
-
-		mav.setViewName("business/StockSyncForm");
-
-		return mav;
-	}
-
-	/**
-	 * 재고연계관리 - 출고처 목록
-	 * @param delvLoc - 출고처 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	@PostMapping("/stock/sync/delvloc/list")
-	@ResponseBody
-	public Collection<DeliveryLoc> getStockSyncDeliveryLocList(@RequestBody DeliveryLoc delvLoc) {
-		return businessService.getStockSyncDeliveryLocList(delvLoc);
-	}
-
-	/**
-	 * 재고연계관리 - 재고연계기준 목록
-	 * @param supplyCompCd - 공급업체코드
-	 * @param delvLocCd - 출고처코드
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	@GetMapping("/stock/sync/base/list/{supplyCompCd}/{delvLocCd}")
-	@ResponseBody
-	public Collection<StockSyncBase> getStockSyncBaseList(@PathVariable String supplyCompCd, @PathVariable String delvLocCd) {
-		StockSyncBase stockSyncBase = new StockSyncBase();
-		stockSyncBase.setSupplyCompCd(supplyCompCd);
-		stockSyncBase.setDelvLocCd(delvLocCd);
-		return businessService.getStockSyncBaseList(stockSyncBase);
-	}
-
-	/**
-	 * 재고연계관리 - 재고연계기준 목록 저장 처리
-	 * @param stockSyncBaseList - 재고연계기준 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	@PostMapping("/stock/sync/base/save")
-	@ResponseBody
-	public GagaResponse saveStockSyncBaseList(@RequestBody Collection<StockSyncBase> stockSyncBaseList) {
-		if (stockSyncBaseList == null || stockSyncBaseList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		businessService.saveStockSyncBaseList(stockSyncBaseList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 판매매장관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@GetMapping("/sellstore/form")
-	public ModelAndView sellStoreForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		mav.setViewName("business/SellStoreForm");
-
-		return mav;
-	}
-
-	/**
-	 * 판매매장 목록
-	 * @param sellStore - 판매매장 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@PostMapping("/sellstore/list")
-	@ResponseBody
-	public Collection<SellStore> getSellStoreList(@RequestBody SellStore sellStore) {
-		return businessService.getSellStoreList(sellStore);
-	}
-
-	/**
-	 * 판매매장 목록 저장 처리
-	 * @param sellStoreList - 판매매장 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@PostMapping("/sellstore/list/save")
-	@ResponseBody
-	public GagaResponse saveSellStoreList(@RequestBody Collection<SellStore> sellStoreList) {
-		if (sellStoreList == null || sellStoreList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		businessService.saveSellStoreList(sellStoreList);
-
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 제휴채널관리
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@GetMapping("/aflink/form")
-	public ModelAndView aflinkForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 제휴채널 콤보박스 목록
-		mav.addObject("afChannelList", rendererService.getCommonCodeList("G053"));
-
-		mav.setViewName("business/AflinkForm");
-
-		return mav;
-	}
-
-	/**
-	 * 제휴채널 목록
-	 * @param afChannel - 제휴채널
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@PostMapping("/aflink/list")
-	@ResponseBody
-	public Collection<Aflink> getAflinkList(@RequestParam(value = "afChannel", required = false) String afChannel) {
-		Aflink aflink = new Aflink();
-		aflink.setAfChannel(afChannel);
-		return businessService.getAflinkList(aflink);
-	}
-
-	/**
-	 * 제휴채널 저장 처리
-	 * @param aflink - 제휴링크 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@PostMapping("/aflink/save")
-	@ResponseBody
-	public GagaResponse saveAflink(@RequestBody Aflink aflink) {
-		businessService.saveAflink(aflink);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 제휴채널 목록 사용안함 처리
-	 * @param aflinkList - 제휴링크 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@PostMapping("/aflink/list/delete")
-	@ResponseBody
-	public GagaResponse deleteAflinkList(@RequestBody Collection<Aflink> aflinkList) {
-		if (aflinkList == null || aflinkList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		businessService.deleteAflinkList(aflinkList);
-		return super.ok(message.getMessage("SUCC_0003"));
-	}
-
-	/**
-	 * 배송업체관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@GetMapping("/ship/company/form")
-	public ModelAndView deliveryCompanyForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("business/ShipCompanyForm");
-
-		return mav;
-	}
-
-	/**
-	 * 배송업체 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@GetMapping("/ship/company/list")
-	@ResponseBody
-	public Collection<ShipCompany> getShipCompanyList() {
-		return businessService.getShipCompanyList();
-	}
-
-	/**
-	 * 배송업체 목록 저장
-	 * @param shipCompList - 배송업체 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@PostMapping("/ship/company/list/save")
-	@ResponseBody
-	public GagaResponse saveShipCompanyList(@RequestBody Collection<ShipCompany> shipCompList) {
-		if (shipCompList == null || shipCompList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		businessService.saveShipCompanyList(shipCompList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 배송업체 목록 삭제
-	 * @param shipCompList - 배송업체 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 20
-	 */
-	@PostMapping("/ship/company/list/delete")
-	@ResponseBody
-	public GagaResponse deleteShipCompanyList(@RequestBody Collection<ShipCompany> shipCompList) {
-		if (shipCompList == null || shipCompList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("FAIL_1004"));
-		}
-
-		businessService.deleteShipCompanyList(shipCompList);
-		return super.ok(message.getMessage("SUCC_0003"));
-	}
-
-}
+package com.style24.admin.biz.web;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.admin.biz.service.TsaBusinessService;
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.biz.service.TscEnvsetService;
+import com.style24.core.support.env.TscConstants;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Aflink;
+import com.style24.persistence.domain.Brand;
+import com.style24.persistence.domain.BrandMd;
+import com.style24.persistence.domain.DeliveryLoc;
+import com.style24.persistence.domain.SellStore;
+import com.style24.persistence.domain.ShipCompany;
+import com.style24.persistence.domain.SiteBrand;
+import com.style24.persistence.domain.StockSyncBase;
+import com.style24.persistence.domain.SupplyCompany;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.rest.server.GagaResponse;
+
+/**
+ * 영업관리 Controller
+ *
+ * @author gagamel
+ * @since 2020. 10. 14
+ */
+@Controller
+@RequestMapping("/business")
+@Slf4j
+public class TsaBusinessController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaBusinessService businessService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private TscEnvsetService cenvsetService;
+
+	/**
+	 * 공급업체관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 14
+	 */
+	@GetMapping("/supply/company/form")
+	public ModelAndView supplyCompanyForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 입점상태
+		mav.addObject("supplyStatList", rendererService.getAvailCommonCodeList("G010"));
+
+		// 유통구분
+		mav.addObject("distributionGbList", rendererService.getAvailCommonCodeList("G065"));
+
+		// 은행
+		mav.addObject("bankList", rendererService.getAvailCommonCodeList("G940"));
+
+		// 정산일
+		mav.addObject("settleDayList", rendererService.getAvailCommonCodeList("G075"));
+
+		mav.setViewName("business/SupplyCompanyForm");
+
+		return mav;
+	}
+
+	/**
+	 * 공급업체관리 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 14
+	 */
+	@PostMapping("/supply/company/list")
+	@ResponseBody
+	public Collection<SupplyCompany> getCompanyList(@RequestBody SupplyCompany supplyComp) {
+		return businessService.getSupplyCompanyList(supplyComp);
+	}
+
+	/**
+	 * 공급업체관리 저장 처리
+	 * @param supplyComp - 공급업체 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 14
+	 */
+	@PostMapping("/supply/company/save")
+	@ResponseBody
+	public GagaResponse saveSupplyInfo(@RequestBody SupplyCompany supplyComp) {
+		supplyComp.setRegNo(TsaSession.getInfo().getUserNo());
+		supplyComp.setUpdNo(TsaSession.getInfo().getUserNo());
+
+		businessService.saveSupplyCompany(supplyComp);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 공급업체출고처관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 16
+	 **/
+	@GetMapping("/supply/company/delvloc/form")
+	public ModelAndView deliveryLocForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// 출고처분류
+		mav.addObject("delvLocClsfList", rendererService.getAvailCommonCodeList("G024"));
+
+		// 송장출력형태
+		mav.addObject("invoicePrintTypeList", rendererService.getAvailCommonCodeList("G025"));
+
+		mav.setViewName("business/DeliveryLocForm");
+
+		return mav;
+	}
+
+	/**
+	 * 공급업체출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 16
+	 **/
+	@PostMapping("/supply/company/delvloc/list")
+	@ResponseBody
+	public Collection<DeliveryLoc> getDeliveryLocList(@RequestBody DeliveryLoc delvLoc) {
+		return businessService.getDeliveryLocList(delvLoc);
+	}
+
+	/**
+	 * 공급업체출고처 저장 처리
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 16
+	 */
+	@PostMapping("/supply/company/delvloc/save")
+	@ResponseBody
+	public GagaResponse saveDeliveryLoc(@RequestBody DeliveryLoc delvLoc) {
+		delvLoc.setRegNo(TsaSession.getInfo().getUserNo());
+		delvLoc.setUpdNo(TsaSession.getInfo().getUserNo());
+		businessService.saveDeliveryLoc(delvLoc);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 브랜드관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/brand/form")
+	public ModelAndView supplyCompanyBrandForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// 유통구분
+		mav.addObject("distributionGbList", rendererService.getAvailCommonCodeList("G065"));
+
+		// 사이트
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 구매적립포인트율
+		mav.addObject("pntInfo", cenvsetService.getEnvset(TscConstants.Site.STYLE24.value(), "C15"));
+
+		mav.setViewName("business/BrandForm");
+
+		return mav;
+	}
+
+	/**
+	 * 브랜드 목록
+	 * @param brand - 브랜드 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@PostMapping("/brand/list")
+	@ResponseBody
+	public Collection<Brand> getBrandList(@RequestBody Brand brand) {
+		return businessService.getBrandList(brand);
+	}
+
+	/**
+	 * 담당MD 목록 화면
+	 * @param brandMd - 담당MD 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/md/list/form")
+	public ModelAndView mdListForm(BrandMd brandMd) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("params", brandMd);
+
+		mav.setViewName("business/MdListForm");
+
+		return mav;
+	}
+
+	/**
+	 * 브랜드담당MD 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@PostMapping("/md/list")
+	@ResponseBody
+	public Collection<BrandMd> getMdList(@RequestBody BrandMd brandMd) {
+		return businessService.getMdList(brandMd);
+	}
+
+	/**
+	 * 브랜드담당MD 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/brand/md/list/{brandCd}")
+	@ResponseBody
+	public Collection<BrandMd> getBrandMdList(@PathVariable String brandCd) {
+		return businessService.getBrandMdList(brandCd);
+	}
+
+	/**
+	 * 브랜드 담당MD 등록/수정 처리
+	 * @param brandMdList - 브랜드담당MD 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@PostMapping("/brand/md/list/save")
+	@ResponseBody
+	public GagaResponse saveBrandMdList(@RequestBody Collection<BrandMd> brandMdList) {
+		if (brandMdList == null || brandMdList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		businessService.saveBrandMdList(brandMdList);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 브랜드 노출사이트 목록
+	 * @param brandCd - 브랜드코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/brand/site/list/{brandCd}")
+	@ResponseBody
+	public Collection<SiteBrand> getBrandSiteList(@PathVariable String brandCd) {
+		return businessService.getBrandSiteList(brandCd);
+	}
+
+	/**
+	 * 브랜드 노출사이트 등록/수정 처리
+	 * @param brandSiteList - 브랜드사이트 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@PostMapping("/brand/site/list/save")
+	@ResponseBody
+	public GagaResponse saveBrandSiteList(@RequestBody Collection<SiteBrand> brandSiteList) {
+		if (brandSiteList == null || brandSiteList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		businessService.saveBrandSiteList(brandSiteList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 브랜드 등록/수정 처리
+	 * @param brand - 브랜드 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	@PostMapping("/brand/save")
+	@ResponseBody
+	public GagaResponse saveBrand(@RequestBody Brand brand) {
+		brand.setRegNo(TsaSession.getInfo().getUserNo());
+		brand.setUpdNo(TsaSession.getInfo().getUserNo());
+		businessService.saveBrand(brand);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 재고연계관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@GetMapping("/stock/sync/form")
+	public ModelAndView stockSyncForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 자사공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd(), "Y"));
+
+		// 출고처 분류
+		String[] exceptCds = {"G024_20", "G024_30"};
+		mav.addObject("delvLocClsfList", rendererService.getCommonCodeList("G024", "Y", exceptCds));
+
+		// 정상이월구분
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+
+		mav.setViewName("business/StockSyncForm");
+
+		return mav;
+	}
+
+	/**
+	 * 재고연계관리 - 출고처 목록
+	 * @param delvLoc - 출고처 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@PostMapping("/stock/sync/delvloc/list")
+	@ResponseBody
+	public Collection<DeliveryLoc> getStockSyncDeliveryLocList(@RequestBody DeliveryLoc delvLoc) {
+		return businessService.getStockSyncDeliveryLocList(delvLoc);
+	}
+
+	/**
+	 * 재고연계관리 - 재고연계기준 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @param delvLocCd - 출고처코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@GetMapping("/stock/sync/base/list/{supplyCompCd}/{delvLocCd}")
+	@ResponseBody
+	public Collection<StockSyncBase> getStockSyncBaseList(@PathVariable String supplyCompCd, @PathVariable String delvLocCd) {
+		StockSyncBase stockSyncBase = new StockSyncBase();
+		stockSyncBase.setSupplyCompCd(supplyCompCd);
+		stockSyncBase.setDelvLocCd(delvLocCd);
+		return businessService.getStockSyncBaseList(stockSyncBase);
+	}
+
+	/**
+	 * 재고연계관리 - 재고연계기준 목록 저장 처리
+	 * @param stockSyncBaseList - 재고연계기준 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@PostMapping("/stock/sync/base/save")
+	@ResponseBody
+	public GagaResponse saveStockSyncBaseList(@RequestBody Collection<StockSyncBase> stockSyncBaseList) {
+		if (stockSyncBaseList == null || stockSyncBaseList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		businessService.saveStockSyncBaseList(stockSyncBaseList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 판매매장관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@GetMapping("/sellstore/form")
+	public ModelAndView sellStoreForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		mav.setViewName("business/SellStoreForm");
+
+		return mav;
+	}
+
+	/**
+	 * 판매매장 목록
+	 * @param sellStore - 판매매장 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/sellstore/list")
+	@ResponseBody
+	public Collection<SellStore> getSellStoreList(@RequestBody SellStore sellStore) {
+		return businessService.getSellStoreList(sellStore);
+	}
+
+	/**
+	 * 판매매장 목록 저장 처리
+	 * @param sellStoreList - 판매매장 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/sellstore/list/save")
+	@ResponseBody
+	public GagaResponse saveSellStoreList(@RequestBody Collection<SellStore> sellStoreList) {
+		if (sellStoreList == null || sellStoreList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		businessService.saveSellStoreList(sellStoreList);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 제휴채널관리
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@GetMapping("/aflink/form")
+	public ModelAndView aflinkForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 제휴채널 콤보박스 목록
+		mav.addObject("afChannelList", rendererService.getCommonCodeList("G053"));
+
+		mav.setViewName("business/AflinkForm");
+
+		return mav;
+	}
+
+	/**
+	 * 제휴채널 목록
+	 * @param afChannel - 제휴채널
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/aflink/list")
+	@ResponseBody
+	public Collection<Aflink> getAflinkList(@RequestParam(value = "afChannel", required = false) String afChannel) {
+		Aflink aflink = new Aflink();
+		aflink.setAfChannel(afChannel);
+		return businessService.getAflinkList(aflink);
+	}
+
+	/**
+	 * 제휴채널 저장 처리
+	 * @param aflink - 제휴링크 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/aflink/save")
+	@ResponseBody
+	public GagaResponse saveAflink(@RequestBody Aflink aflink) {
+		businessService.saveAflink(aflink);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 제휴채널 목록 사용안함 처리
+	 * @param aflinkList - 제휴링크 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/aflink/list/delete")
+	@ResponseBody
+	public GagaResponse deleteAflinkList(@RequestBody Collection<Aflink> aflinkList) {
+		if (aflinkList == null || aflinkList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		businessService.deleteAflinkList(aflinkList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 배송업체관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@GetMapping("/ship/company/form")
+	public ModelAndView deliveryCompanyForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("business/ShipCompanyForm");
+
+		return mav;
+	}
+
+	/**
+	 * 배송업체 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@GetMapping("/ship/company/list")
+	@ResponseBody
+	public Collection<ShipCompany> getShipCompanyList() {
+		return businessService.getShipCompanyList();
+	}
+
+	/**
+	 * 배송업체 목록 저장
+	 * @param shipCompList - 배송업체 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/ship/company/list/save")
+	@ResponseBody
+	public GagaResponse saveShipCompanyList(@RequestBody Collection<ShipCompany> shipCompList) {
+		if (shipCompList == null || shipCompList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		businessService.saveShipCompanyList(shipCompList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 배송업체 목록 삭제
+	 * @param shipCompList - 배송업체 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/ship/company/list/delete")
+	@ResponseBody
+	public GagaResponse deleteShipCompanyList(@RequestBody Collection<ShipCompany> shipCompList) {
+		if (shipCompList == null || shipCompList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1004"));
+		}
+
+		businessService.deleteShipCompanyList(shipCompList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+}

+ 221 - 221
style24.admin/src/main/java/com/style24/admin/biz/web/TsaCommonController.java

@@ -1,221 +1,221 @@
-package com.style24.admin.biz.web;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.env.Environment;
-import org.springframework.core.io.InputStreamResource;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Controller;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.ModelAndView;
-
-import com.style24.admin.biz.service.TsaCommonService;
-import com.style24.admin.support.controller.TsaBaseController;
-
-import lombok.extern.slf4j.Slf4j;
-
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.util.GagaFileUploadUtil;
-import com.gagaframework.web.util.GagaFileUtil;
-import com.gagaframework.web.util.GagaFtpUtil;
-import com.gagaframework.web.util.GagaUploadedFileInfo;
-
-/**
- * 공통 Controller
- *
- * @author renderer
- * @since 2020. 10. 22
- */
-@Controller
-@RequestMapping("/common")
-@Slf4j
-public class TsaCommonController extends TsaBaseController {
-
-
-	@Autowired
-	private Environment env;
-
-	@Autowired
-	private TsaCommonService commonService;
-
-
-	@Value("${upload.default.target.path}")
-	private String uploadTargetPath;
-
-	/**
-	 * Download a file
-	 *
-	 * @param request - HttpServletRequest
-	 * @param downloadFile - 다운로드할 파일
-	 * @return
-	 * @throws IOException
-	 * @author gagamel
-	 * @since 2019. 12. 6
-	 */
-	@GetMapping("/file/download")
-	@ResponseBody
-	public ResponseEntity<InputStreamResource> downloadFile(HttpServletRequest request, @RequestParam("downloadFile") String downloadFile) throws IOException {
-		String fileName = StringUtils.replace(downloadFile, "../", "");
-		log.debug("fileName: {}", fileName);
-
-		String downloadPath = env.getProperty("download.path");
-		log.debug("downLoadPath :{}", downloadPath);
-
-		String fileNameWithPath = GagaFileUtil.getConcatenationPath(downloadPath, fileName);
-		log.debug("fileNameWithPath: {}", fileNameWithPath);
-
-		return GagaFileUtil.writeFile(request, fileNameWithPath);
-	}
-
-	/**
-	 * Upload a file
-	 *
-	 * @param subDir - 업로드 하위 디렉토리
-	 * @param policy - 업로드 정책
-	 * @param file - MultipartFile
-	 * @return 업로드한 파일의 정보
-	 * @throws IOException
-	 * @author gagamel
-	 * @since 2019. 12. 6
-	 */
-	@PostMapping("/file/upload")
-	@ResponseBody
-	public GagaUploadedFileInfo uploadFile(@RequestParam(value = "subDir") String subDir, @RequestParam(value = "policy", required = false) String policy, MultipartFile file) throws IOException {
-		if (StringUtils.isEmpty(policy)) {
-			policy = "default";
-		}
-
-		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload." + policy + ".target.path"), subDir);
-
-		GagaFileUploadUtil fuUtil = new GagaFileUploadUtil(targetPath, Long.parseLong(env.getProperty("upload." + policy + ".max.size")), env.getProperty("upload." + policy + ".allow.extension"), env.getProperty("upload." + policy + ".view"));
-
-		GagaUploadedFileInfo ufInfo = fuUtil.uploadFile(file);
-		if (!"excel".equals(policy)) {
-			// 운영서버에서만 FTP로 파일 업로드
-			String profiles = env.getProperty("spring.profiles.active").toLowerCase();
-			if ("run".equals(profiles) || "locp".equals(profiles)) {
-				GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
-
-				File srcFile = new File(GagaFileUtil.getConcatenationPath(targetPath, ufInfo.getNewFileName()));
-				ftpUtil.upload(srcFile, "/" + subDir);
-				ftpUtil.close();
-			}
-		}
-		return ufInfo;
-	}
-
-	/**
-	 * Delete a file
-	 *
-	 * @param subDir - 업로드 하위 디렉토리
-	 * @param fileNm - 파일명
-	 * @return
-	 * @throws IOException
-	 * @author sasa004
-	 * @since 2020. 04. 06
-	 */
-	@PostMapping("/file/delete")
-	@ResponseBody
-	public void deleteFile(@RequestParam(value = "subDir") String subDir, @RequestParam(value = "fileNm", required = false) String fileNm) throws IOException {
-		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.default.target.path"), subDir);
-
-		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, fileNm));
-
-		// 운영서버이면 FTP 파일 삭제
-		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
-		if ("run".equals(profiles) || "locp".equals(profiles)) {
-			GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
-			log.debug("targetPath : " + targetPath);
-			ftpUtil.delete("/" + subDir, fileNm);
-			ftpUtil.close();
-		}
-	}
-
-	/**
-	 * Upload files
-	 *
-	 * @param subDir - 업로드 하위 디렉토리
-	 * @param files - MultipartFile List
-	 * @return 업로드한 파일의 정보
-	 * @throws IOException
-	 * @author gagamel
-	 * @since 2019. 12. 6
-	 */
-	@PostMapping("/files/upload")
-	@ResponseBody
-	public Collection<GagaUploadedFileInfo> uploadFiles(@RequestParam(value = "subDir") String subDir, List<MultipartFile> files) throws IOException {
-		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.default.target.path"), subDir);
-		GagaFileUploadUtil fuUtil = new GagaFileUploadUtil(targetPath);
-
-		Collection<GagaUploadedFileInfo> ufList = fuUtil.uploadFiles(files);
-		log.debug("ufList: {}", ufList);
-
-		// 운영서버에서만 FTP로 파일 업로드
-		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
-		if ("run".equals(profiles) || "locp".equals(profiles)) {
-			if (ufList != null && !ufList.isEmpty()) {
-				GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
-
-				for (GagaUploadedFileInfo ufInfo : ufList) {
-					File srcFile = new File(GagaFileUtil.getConcatenationPath(targetPath, ufInfo.getNewFileName()));
-					ftpUtil.upload(srcFile, "/" + subDir);
-				}
-
-				ftpUtil.close();
-			}
-		}
-
-		return ufList;
-	}
-
-	/**
-	 * 엑셀 업로드 팝업
-	 *
-	 * @param procJob - 업무명
-	 * @param callBackFun - 콜백함수
-	 * @return
-	 * @author eskim
-	 * @since 2019. 12. 6
-	 */
-	@GetMapping("/excel/upload/popup/form")
-	public ModelAndView excelUploadPopupForm(@RequestParam(value = "procJob") String procJob, @RequestParam(value = "callBackFun", required = false) String callBackFun) {
-		ModelAndView mav = new ModelAndView();
-
-		GagaMap params = new GagaMap();
-		params.setString("procJob", procJob);
-		params.setString("callBackFun", callBackFun);
-
-		mav.addObject("params", params);
-
-		mav.setViewName("common/ExcelUploadPopupForm");
-
-		return mav;
-	}
-
-	/**
-	 * 샘플파일 시스템파일명 조회
-	 * @param sampleFileId - 샘플파일ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@GetMapping("/sample/file/{sampleFileId}")
-	@ResponseBody
-	public String getSampleFileSystemFilename(@PathVariable("sampleFileId") String sampleFileId) {
-		return commonService.getSampleFileSystemFilename(sampleFileId);
-	}
-}
+package com.style24.admin.biz.web;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.admin.biz.service.TsaCommonService;
+import com.style24.admin.support.controller.TsaBaseController;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.util.GagaFileUploadUtil;
+import com.gagaframework.web.util.GagaFileUtil;
+import com.gagaframework.web.util.GagaFtpUtil;
+import com.gagaframework.web.util.GagaUploadedFileInfo;
+
+/**
+ * 공통 Controller
+ *
+ * @author renderer
+ * @since 2020. 10. 22
+ */
+@Controller
+@RequestMapping("/common")
+@Slf4j
+public class TsaCommonController extends TsaBaseController {
+
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TsaCommonService commonService;
+
+
+	@Value("${upload.default.target.path}")
+	private String uploadTargetPath;
+
+	/**
+	 * Download a file
+	 *
+	 * @param request - HttpServletRequest
+	 * @param downloadFile - 다운로드할 파일
+	 * @return
+	 * @throws IOException
+	 * @author gagamel
+	 * @since 2019. 12. 6
+	 */
+	@GetMapping("/file/download")
+	@ResponseBody
+	public ResponseEntity<InputStreamResource> downloadFile(HttpServletRequest request, @RequestParam("downloadFile") String downloadFile) throws IOException {
+		String fileName = StringUtils.replace(downloadFile, "../", "");
+		log.debug("fileName: {}", fileName);
+
+		String downloadPath = env.getProperty("download.path");
+		log.debug("downLoadPath :{}", downloadPath);
+
+		String fileNameWithPath = GagaFileUtil.getConcatenationPath(downloadPath, fileName);
+		log.debug("fileNameWithPath: {}", fileNameWithPath);
+
+		return GagaFileUtil.writeFile(request, fileNameWithPath);
+	}
+
+	/**
+	 * Upload a file
+	 *
+	 * @param subDir - 업로드 하위 디렉토리
+	 * @param policy - 업로드 정책
+	 * @param file - MultipartFile
+	 * @return 업로드한 파일의 정보
+	 * @throws IOException
+	 * @author gagamel
+	 * @since 2019. 12. 6
+	 */
+	@PostMapping("/file/upload")
+	@ResponseBody
+	public GagaUploadedFileInfo uploadFile(@RequestParam(value = "subDir") String subDir, @RequestParam(value = "policy", required = false) String policy, MultipartFile file) throws IOException {
+		if (StringUtils.isEmpty(policy)) {
+			policy = "default";
+		}
+
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload." + policy + ".target.path"), subDir);
+
+		GagaFileUploadUtil fuUtil = new GagaFileUploadUtil(targetPath, Long.parseLong(env.getProperty("upload." + policy + ".max.size")), env.getProperty("upload." + policy + ".allow.extension"), env.getProperty("upload." + policy + ".view"));
+
+		GagaUploadedFileInfo ufInfo = fuUtil.uploadFile(file);
+		if (!"excel".equals(policy)) {
+			// 운영서버에서만 FTP로 파일 업로드
+			String profiles = env.getProperty("spring.profiles.active").toLowerCase();
+			if ("run".equals(profiles) || "locp".equals(profiles)) {
+				GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
+
+				File srcFile = new File(GagaFileUtil.getConcatenationPath(targetPath, ufInfo.getNewFileName()));
+				ftpUtil.upload(srcFile, "/" + subDir);
+				ftpUtil.close();
+			}
+		}
+		return ufInfo;
+	}
+
+	/**
+	 * Delete a file
+	 *
+	 * @param subDir - 업로드 하위 디렉토리
+	 * @param fileNm - 파일명
+	 * @return
+	 * @throws IOException
+	 * @author sasa004
+	 * @since 2020. 04. 06
+	 */
+	@PostMapping("/file/delete")
+	@ResponseBody
+	public void deleteFile(@RequestParam(value = "subDir") String subDir, @RequestParam(value = "fileNm", required = false) String fileNm) throws IOException {
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.default.target.path"), subDir);
+
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, fileNm));
+
+		// 운영서버이면 FTP 파일 삭제
+		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
+		if ("run".equals(profiles) || "locp".equals(profiles)) {
+			GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
+			log.debug("targetPath : " + targetPath);
+			ftpUtil.delete("/" + subDir, fileNm);
+			ftpUtil.close();
+		}
+	}
+
+	/**
+	 * Upload files
+	 *
+	 * @param subDir - 업로드 하위 디렉토리
+	 * @param files - MultipartFile List
+	 * @return 업로드한 파일의 정보
+	 * @throws IOException
+	 * @author gagamel
+	 * @since 2019. 12. 6
+	 */
+	@PostMapping("/files/upload")
+	@ResponseBody
+	public Collection<GagaUploadedFileInfo> uploadFiles(@RequestParam(value = "subDir") String subDir, List<MultipartFile> files) throws IOException {
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.default.target.path"), subDir);
+		GagaFileUploadUtil fuUtil = new GagaFileUploadUtil(targetPath);
+
+		Collection<GagaUploadedFileInfo> ufList = fuUtil.uploadFiles(files);
+		log.debug("ufList: {}", ufList);
+
+		// 운영서버에서만 FTP로 파일 업로드
+		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
+		if ("run".equals(profiles) || "locp".equals(profiles)) {
+			if (ufList != null && !ufList.isEmpty()) {
+				GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
+
+				for (GagaUploadedFileInfo ufInfo : ufList) {
+					File srcFile = new File(GagaFileUtil.getConcatenationPath(targetPath, ufInfo.getNewFileName()));
+					ftpUtil.upload(srcFile, "/" + subDir);
+				}
+
+				ftpUtil.close();
+			}
+		}
+
+		return ufList;
+	}
+
+	/**
+	 * 엑셀 업로드 팝업
+	 *
+	 * @param procJob - 업무명
+	 * @param callBackFun - 콜백함수
+	 * @return
+	 * @author eskim
+	 * @since 2019. 12. 6
+	 */
+	@GetMapping("/excel/upload/popup/form")
+	public ModelAndView excelUploadPopupForm(@RequestParam(value = "procJob") String procJob, @RequestParam(value = "callBackFun", required = false) String callBackFun) {
+		ModelAndView mav = new ModelAndView();
+
+		GagaMap params = new GagaMap();
+		params.setString("procJob", procJob);
+		params.setString("callBackFun", callBackFun);
+
+		mav.addObject("params", params);
+
+		mav.setViewName("common/ExcelUploadPopupForm");
+
+		return mav;
+	}
+
+	/**
+	 * 샘플파일 시스템파일명 조회
+	 * @param sampleFileId - 샘플파일ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@GetMapping("/sample/file/{sampleFileId}")
+	@ResponseBody
+	public String getSampleFileSystemFilename(@PathVariable("sampleFileId") String sampleFileId) {
+		return commonService.getSampleFileSystemFilename(sampleFileId);
+	}
+}

+ 276 - 276
style24.admin/src/main/java/com/style24/admin/biz/web/TsaEnvsetController.java

@@ -1,276 +1,276 @@
-package com.style24.admin.biz.web;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import com.style24.admin.biz.service.TsaAnswerPhaseService;
-import com.style24.admin.biz.service.TsaClauseService;
-import com.style24.admin.biz.service.TsaEnvsetService;
-import com.style24.admin.biz.service.TsaRendererService;
-import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.core.biz.service.TscEnvsetService;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.AnswerPhase;
-import com.style24.persistence.domain.Clause;
-import com.style24.persistence.domain.Envset;
-
-import lombok.extern.slf4j.Slf4j;
-
-import com.gagaframework.web.rest.server.GagaResponse;
-
-/**
- * 환경설정 Controller
- *
- * @author gagamel
- * @since 2020. 10. 21
- */
-@Controller
-@RequestMapping("/envset")
-@Slf4j
-public class TsaEnvsetController extends TsaBaseController {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private TscEnvsetService cenvsetService;
-
-	@Autowired
-	private TsaEnvsetService envsetService;
-
-	@Autowired
-	private TsaRendererService rendererService;
-
-	@Autowired
-	private TsaClauseService clauseService;
-
-	@Autowired
-	private TsaAnswerPhaseService ansPhaseService;
-
-	/**
-	 * 기본환경설정 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	@GetMapping("/basic/form")
-	public ModelAndView basicSetForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 사이트 목록
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-
-		mav.setViewName("envset/BasicEnvsetForm");
-
-		return mav;
-	}
-
-	/**
-	 * 사이트별 환경설정유형에 따른 환경설정 정보
-	 * @param siteCd - 사이트코드
-	 * @param envsetType - 환경설정유형
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	@GetMapping("/{siteCd}/{envsetType}")
-	@ResponseBody
-	public Envset getEnvset(@PathVariable String siteCd, @PathVariable String envsetType) {
-		return cenvsetService.getEnvset(siteCd, envsetType);
-	}
-
-	/**
-	 * 환경설정 정보 저장
-	 * @param envset - 환경설정 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	@PostMapping("/create")
-	@ResponseBody
-	public GagaResponse createEnvset(@RequestBody Envset envset) {
-		if (envset.getEnvsetType().equals("B10")) {
-			// 메타 정보 수정 시는 캐싱 삭제되도록
-			// 중요하지 않은 정보로서 캐싱 삭제해도 됨.
-			envsetService.createEnvsetMetaInfo(envset);
-		} else {
-			// 그 외는 캐싱 삭제 안 함
-			// 정책은 중요한 정보로서 캐싱 문제 발생 시 심각해질 수 있으므로 캐싱처리 안 함(2020.05.14. gagamel)
-			envsetService.createEnvset(envset);
-		}
-
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 사이트별 환경설정유형에 따른 환경설정이력 화면
-	 * @param siteCd - 사이트코드
-	 * @param envsetType - 환경설정유형
-	 * @param envsetTypeNm - 환경설정유형명
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	@GetMapping("/history/form")
-	public ModelAndView basicSetForm(@RequestParam(value = "siteCd", required = true) String siteCd, @RequestParam(value = "envsetType", required = true) String envsetType, @RequestParam(value = "envsetTypeNm", required = true) String envsetTypeNm) {
-		ModelAndView mav = new ModelAndView();
-
-		mav.addObject("siteCd", siteCd);
-		mav.addObject("envsetType", envsetType);
-		mav.addObject("envsetTypeNm", envsetTypeNm);
-
-		mav.setViewName("envset/EnvsetHistoryForm");
-
-		return mav;
-	}
-
-	/**
-	 * 사이트별 환경설정유형에 따른 환경설정이력 목록
-	 * @param siteCd - 사이트코드
-	 * @param envsetType - 환경설정유형
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 21
-	 */
-	@GetMapping("/history/{siteCd}/{envsetType}")
-	@ResponseBody
-	public Collection<Envset> getEnvsetHistoryList(@PathVariable String siteCd, @PathVariable String envsetType) {
-		return envsetService.getEnvsetHistoryList(siteCd, envsetType);
-	}
-
-	/**
-	 * 약관관리 화면
-	 * @return ModelAndView
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@GetMapping("/clause/form")
-	public ModelAndView clauseForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 사이트 목록
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-
-		// 약관유형 목록
-		mav.addObject("clauseTypeList", rendererService.getAvailCommonCodeList("G057"));
-
-		mav.setViewName("envset/ClauseForm");
-
-		return mav;
-	}
-
-	/**
-	 * 약관관리 목록
-	 * @param clause - 약관 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@PostMapping("/clause/list")
-	@ResponseBody
-	public Collection<Clause> getClauseList(@RequestBody Clause clause) {
-		return clauseService.getClauseList(clause);
-	}
-
-	/**
-	 * 약관관리상세 화면
-	 * @param mode - 모드(N:신규, U:상세)
-	 * @param clauseSq - 약관일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@GetMapping("/clause/detail/form")
-	public ModelAndView clauseDetailForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "clauseSq", required = false) Integer clauseSq) {
-		ModelAndView mav = new ModelAndView();
-
-		// 사이트 목록
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-
-		// 약관유형 목록
-		mav.addObject("clauseTypeList", rendererService.getAvailCommonCodeList("G057"));
-
-		// 모드 값
-		mav.addObject("mode", mode);
-
-		if ("U".equals(mode)) {
-			mav.addObject("clauseInfo", clauseService.getClauseDetail(clauseSq));
-		}
-
-		mav.setViewName("envset/ClauseDetailForm");
-
-		return mav;
-	}
-
-	/**
-	 * 약관 생성/수정
-	 * @param clause - 약관 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@PostMapping("/clause/save")
-	@ResponseBody
-	public GagaResponse saveClause(@RequestBody Clause clause) {
-		clauseService.saveClause(clause);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 답변문구관리
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@GetMapping("/answer/phase/form")
-	public ModelAndView answerPhaseForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 사이트콤보
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-
-		// 답변종류콤보
-		mav.addObject("ansClsfList", rendererService.getAvailCommonCodeList("G061"));
-
-		mav.setViewName("envset/AnswerPhaseForm");
-
-		return mav;
-	}
-
-	/**
-	 * 답변문구 목록
-	 * @param ansPhase - 답변문구 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@PostMapping("/answer/phase/list")
-	@ResponseBody
-	public Collection<AnswerPhase> getAnswerPhaseList(@RequestBody AnswerPhase ansPhase) {
-		return ansPhaseService.getAnswerPhaseList(ansPhase);
-	}
-
-	/**
-	 * 답변문구 저장
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 29
-	 */
-	@PostMapping("/answer/phase/save")
-	@ResponseBody
-	public GagaResponse saveAnswerPhase(@RequestBody AnswerPhase ansPhase) {
-		ansPhaseService.saveAnswerPhase(ansPhase);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-}
+package com.style24.admin.biz.web;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.admin.biz.service.TsaAnswerPhaseService;
+import com.style24.admin.biz.service.TsaClauseService;
+import com.style24.admin.biz.service.TsaEnvsetService;
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.core.biz.service.TscEnvsetService;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.AnswerPhase;
+import com.style24.persistence.domain.Clause;
+import com.style24.persistence.domain.Envset;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.rest.server.GagaResponse;
+
+/**
+ * 환경설정 Controller
+ *
+ * @author gagamel
+ * @since 2020. 10. 21
+ */
+@Controller
+@RequestMapping("/envset")
+@Slf4j
+public class TsaEnvsetController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TscEnvsetService cenvsetService;
+
+	@Autowired
+	private TsaEnvsetService envsetService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private TsaClauseService clauseService;
+
+	@Autowired
+	private TsaAnswerPhaseService ansPhaseService;
+
+	/**
+	 * 기본환경설정 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	@GetMapping("/basic/form")
+	public ModelAndView basicSetForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		mav.setViewName("envset/BasicEnvsetForm");
+
+		return mav;
+	}
+
+	/**
+	 * 사이트별 환경설정유형에 따른 환경설정 정보
+	 * @param siteCd - 사이트코드
+	 * @param envsetType - 환경설정유형
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	@GetMapping("/{siteCd}/{envsetType}")
+	@ResponseBody
+	public Envset getEnvset(@PathVariable String siteCd, @PathVariable String envsetType) {
+		return cenvsetService.getEnvset(siteCd, envsetType);
+	}
+
+	/**
+	 * 환경설정 정보 저장
+	 * @param envset - 환경설정 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	@PostMapping("/create")
+	@ResponseBody
+	public GagaResponse createEnvset(@RequestBody Envset envset) {
+		if (envset.getEnvsetType().equals("B10")) {
+			// 메타 정보 수정 시는 캐싱 삭제되도록
+			// 중요하지 않은 정보로서 캐싱 삭제해도 됨.
+			envsetService.createEnvsetMetaInfo(envset);
+		} else {
+			// 그 외는 캐싱 삭제 안 함
+			// 정책은 중요한 정보로서 캐싱 문제 발생 시 심각해질 수 있으므로 캐싱처리 안 함(2020.05.14. gagamel)
+			envsetService.createEnvset(envset);
+		}
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 사이트별 환경설정유형에 따른 환경설정이력 화면
+	 * @param siteCd - 사이트코드
+	 * @param envsetType - 환경설정유형
+	 * @param envsetTypeNm - 환경설정유형명
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	@GetMapping("/history/form")
+	public ModelAndView basicSetForm(@RequestParam(value = "siteCd", required = true) String siteCd, @RequestParam(value = "envsetType", required = true) String envsetType, @RequestParam(value = "envsetTypeNm", required = true) String envsetTypeNm) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("siteCd", siteCd);
+		mav.addObject("envsetType", envsetType);
+		mav.addObject("envsetTypeNm", envsetTypeNm);
+
+		mav.setViewName("envset/EnvsetHistoryForm");
+
+		return mav;
+	}
+
+	/**
+	 * 사이트별 환경설정유형에 따른 환경설정이력 목록
+	 * @param siteCd - 사이트코드
+	 * @param envsetType - 환경설정유형
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 21
+	 */
+	@GetMapping("/history/{siteCd}/{envsetType}")
+	@ResponseBody
+	public Collection<Envset> getEnvsetHistoryList(@PathVariable String siteCd, @PathVariable String envsetType) {
+		return envsetService.getEnvsetHistoryList(siteCd, envsetType);
+	}
+
+	/**
+	 * 약관관리 화면
+	 * @return ModelAndView
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@GetMapping("/clause/form")
+	public ModelAndView clauseForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 약관유형 목록
+		mav.addObject("clauseTypeList", rendererService.getAvailCommonCodeList("G057"));
+
+		mav.setViewName("envset/ClauseForm");
+
+		return mav;
+	}
+
+	/**
+	 * 약관관리 목록
+	 * @param clause - 약관 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@PostMapping("/clause/list")
+	@ResponseBody
+	public Collection<Clause> getClauseList(@RequestBody Clause clause) {
+		return clauseService.getClauseList(clause);
+	}
+
+	/**
+	 * 약관관리상세 화면
+	 * @param mode - 모드(N:신규, U:상세)
+	 * @param clauseSq - 약관일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@GetMapping("/clause/detail/form")
+	public ModelAndView clauseDetailForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "clauseSq", required = false) Integer clauseSq) {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 약관유형 목록
+		mav.addObject("clauseTypeList", rendererService.getAvailCommonCodeList("G057"));
+
+		// 모드 값
+		mav.addObject("mode", mode);
+
+		if ("U".equals(mode)) {
+			mav.addObject("clauseInfo", clauseService.getClauseDetail(clauseSq));
+		}
+
+		mav.setViewName("envset/ClauseDetailForm");
+
+		return mav;
+	}
+
+	/**
+	 * 약관 생성/수정
+	 * @param clause - 약관 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@PostMapping("/clause/save")
+	@ResponseBody
+	public GagaResponse saveClause(@RequestBody Clause clause) {
+		clauseService.saveClause(clause);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 답변문구관리
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@GetMapping("/answer/phase/form")
+	public ModelAndView answerPhaseForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트콤보
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 답변종류콤보
+		mav.addObject("ansClsfList", rendererService.getAvailCommonCodeList("G061"));
+
+		mav.setViewName("envset/AnswerPhaseForm");
+
+		return mav;
+	}
+
+	/**
+	 * 답변문구 목록
+	 * @param ansPhase - 답변문구 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@PostMapping("/answer/phase/list")
+	@ResponseBody
+	public Collection<AnswerPhase> getAnswerPhaseList(@RequestBody AnswerPhase ansPhase) {
+		return ansPhaseService.getAnswerPhaseList(ansPhase);
+	}
+
+	/**
+	 * 답변문구 저장
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 29
+	 */
+	@PostMapping("/answer/phase/save")
+	@ResponseBody
+	public GagaResponse saveAnswerPhase(@RequestBody AnswerPhase ansPhase) {
+		ansPhaseService.saveAnswerPhase(ansPhase);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+}

+ 1417 - 1417
style24.admin/src/main/java/com/style24/admin/biz/web/TsaGoodsController.java

@@ -1,1417 +1,1417 @@
-package com.style24.admin.biz.web;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
-import org.springframework.core.io.InputStreamResource;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Controller;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.style24.admin.biz.service.TsaGoodsService;
-import com.style24.admin.biz.service.TsaRendererService;
-import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.TsaPageRequest;
-import com.style24.persistence.domain.Color;
-import com.style24.persistence.domain.Goods;
-import com.style24.persistence.domain.GoodsCompose;
-import com.style24.persistence.domain.GoodsEpSkip;
-import com.style24.persistence.domain.GoodsHst;
-import com.style24.persistence.domain.GoodsNotiInfo;
-import com.style24.persistence.domain.GoodsSearch;
-import com.style24.persistence.domain.GoodsTnmRes;
-import com.style24.persistence.domain.Itemkind;
-import com.style24.persistence.domain.NotiInfo;
-import com.style24.persistence.domain.Notice;
-import com.style24.persistence.domain.NoticeGoods;
-
-import lombok.extern.slf4j.Slf4j;
-
-import com.gagaframework.excel.GagaExcelUtil;
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponse;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
-import com.gagaframework.web.util.GagaDateUtil;
-import com.gagaframework.web.util.GagaFileUtil;
-
-/**
- * 상품관리 Controller
- *
- * @author eskim
- * @since 2020. 10. 16
- */
-@Controller
-@RequestMapping("/goods")
-@Slf4j
-public class TsaGoodsController extends TsaBaseController {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private Environment env;
-
-	@Autowired
-	private TsaGoodsService goodsService;
-
-	@Autowired
-	private TsaRendererService rendererService;
-
-	/**
-	 * 품목관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/itemkind/base/form")
-	public ModelAndView itemkindBaseForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 정보고시 목록
-		mav.addObject("niClsfCdList", rendererService.getAvailCommonCodeList("G004"));
-
-		mav.setViewName("goods/ItemkindBaseForm");
-
-		return mav;
-	}
-
-	/**
-	 * 품목관리 조회
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@PostMapping("/itemkind/base/list")
-	@ResponseBody
-	public Collection<Itemkind> getItemkindList(@RequestBody Itemkind itemkind) {
-		return goodsService.getItemkindList(itemkind);
-	}
-
-	/**
-	 * 품목 관리 저장/등록
-	 *
-	 * @param itemkindList
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@PostMapping("/itemkind/save")
-	@ResponseBody
-	public GagaResponse saveItemkindInfo(@RequestBody Collection<Itemkind> itemkindList) {
-		goodsService.saveItemkindInfo(itemkindList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 품목관리 삭제
-	 *
-	 * @param itemkindList
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@PostMapping("/itemkind/delete")
-	@ResponseBody
-	public GagaResponse deleteItemkindInfo(@RequestBody Collection<Itemkind> itemkindList) {
-		goodsService.deleteItemkindInfo(itemkindList);
-		return super.ok(message.getMessage("SUCC_0003"));
-	}
-
-	/**
-	 * 색상관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/color/form")
-	public ModelAndView colorForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 대표컬러목록
-		mav.addObject("groupColorCodeList", rendererService.getColorGrpCdRgbList());
-		// 대표컬러명목록
-		mav.addObject("groupColorCodeNmList", rendererService.getCommonCodeList("G072"));
-
-		mav.setViewName("goods/ColorForm");
-
-		return mav;
-	}
-
-	/**
-	 * 색상 조회
-	 *
-	 * @param color
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@PostMapping("/color/list")
-	@ResponseBody
-	public Collection<Color> getColorList(@RequestBody Color color) {
-		return goodsService.getColorList(color);
-	}
-
-	/**
-	 * 색상 저장
-	 *
-	 * @param color
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@PostMapping("/color/save")
-	@ResponseBody
-	public GagaResponse saveColor(@RequestBody Collection<Color> colorList) {
-
-		goodsService.saveColor(colorList);
-
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-	/**
-	 * 시즌관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/season/form")
-	public ModelAndView seasonForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("goods/SeasonForm");
-
-		return mav;
-	}
-
-	/**
-	 * 고시정보관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/notiinfo/form")
-	public ModelAndView notiinfoForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// 정보고시 분류별 항목
-		mav.addObject("niItemCdList", rendererService.getAvailCommonCodeList("G005"));
-		// 공급업체
-//		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
-
-		mav.setViewName("goods/NotiinfoForm");
-
-		return mav;
-	}
-
-	/**
-	 * 정보고시관리 조회
-	 *
-	 * @param notiInfo
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 19
-	 */
-	@PostMapping("/notiInfo/list")
-	@ResponseBody
-	public Collection<NotiInfo> getNotiInfoList(@RequestBody NotiInfo notiInfo) {
-		return goodsService.getNotiInfoList(notiInfo);
-	}
-
-	/**
-	 * 정보고시 항목 목록
-	 *
-	 * @param notiInfo
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 19
-	 */
-	@PostMapping("/notiInfo/item/list")
-	@ResponseBody
-	public Collection<NotiInfo> getNotiInfoItemList(@RequestBody NotiInfo notiInfo) {
-		return goodsService.getNotiInfoItemList(notiInfo);
-	}
-
-	/**
-	 * 정보고시 상세 저장
-	 *
-	 * @param notiInfoList
-	 * @return
-	 * @author eskim
-	 * @since 2010. 10. 19
-	 */
-	@PostMapping("/notiInfo/item/save")
-	@ResponseBody
-	public GagaResponse saveNotiInfoItem(@RequestBody Collection<NotiInfo> notiInfoList) {
-
-		goodsService.saveNotiInfoItem(notiInfoList);
-
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 상품목록 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/list/form")
-	public ModelAndView listForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
-		// 상품상태
-		String[] exceptCds = {"G008_00"};
-		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
-		// 정상이월
-		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
-		// 성별
-		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
-		// 시즌
-		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
-		// 년도
-		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
-		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
-		// 연령대
-		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
-		// 사용여부
-		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// 품목
-		mav.addObject("itemkindList", rendererService.getAllItemkindList());
-		// 상품유형
-		mav.addObject("goodsTypeList", rendererService.getAvailCommonCodeList("G056"));
-		// MD
-		mav.addObject("brandMdList", rendererService.getBrandMdList());
-
-		mav.setViewName("goods/GoodsListForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품목록 조회
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 20
-	 */
-	@PostMapping("/list")
-	@ResponseBody
-	public GagaMap getGoodsList(@RequestBody GoodsSearch goodsSearch) {
-
-		GagaMap result = new GagaMap();
-
-		// 입점업체담당자는 업체코드 설정
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
-			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
-		}
-
-		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
-			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
-
-			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
-				goodsSearch.setSearchGb("EXTEND");
-			} else if ("searchMasterGoodsCd".equals(goodsSearch.getSearch())) {
-				goodsSearch.setSearchGb("MASTER");
-			}
-		}
-
-		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
-		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
-		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsListCount(goodsSearch));
-
-		result.set("pageing", goodsSearch);
-		result.set("goodsList", goodsService.getGoodsList(goodsSearch));
-
-		return result;
-	}
-
-	/**
-	 * 상품목록 - 기본정보 엑셀다운로드
-	 *
-	 * @param goodsSearch
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 21
-	 */
-	@GetMapping("/info/excel/list")
-	public ResponseEntity<InputStreamResource> downloadGoodsInfoExcelList(HttpServletRequest request, GoodsSearch goodsSearch) throws Exception {
-		String excelfileName = "상품_기본정보_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
-		String excelFilenameWithPath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
-
-		// 입점업체담당자는 업체코드 설정
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
-			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
-		}
-		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
-
-		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
-			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
-
-			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
-				goodsSearch.setSearchGb("EXTEND");
-			} else if ("searchMasterGoodsCd".equals(goodsSearch.getSearch())) {
-				goodsSearch.setSearchGb("MASTER");
-			}
-		}
-
-		// 대용량엑셀파일다운로드는 이런 식으로 ...
-		goodsService.getGoodsInfoExcelList(goodsSearch, excelFilenameWithPath);
-
-		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
-	}
-
-	/**
-	 * 상품 수정 항목 일괄변경
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 01. 17
-	 */
-	@PostMapping("/state/update")
-	@ResponseBody
-	public GagaMap updateGoodsState(@RequestBody Goods goods) {
-
-		GagaMap result = new GagaMap();
-		result.set("status", GagaResponseStatus.SUCCESS.getCode()); // 200
-		result.set("procJob", goods.getProcJob());
-		// result.set("message", message.getMessage("SUCC_0001"));
-
-		String returnGoods = "";
-		String resultFlag = "SUCC";
-
-		if (!"G001_0000".equals(TsaSession.getInfo().getRoleCd()) && !"G001_A000".equals(TsaSession.getInfo().getRoleCd())
-			&& !"G001_A001".equals(TsaSession.getInfo().getRoleCd()) && !"G001_A100".equals(TsaSession.getInfo().getRoleCd())
-			&& !"G001_A101".equals(TsaSession.getInfo().getRoleCd())) {
-			throw new IllegalStateException("권한이 없습니다.");
-		}
-
-		// 상품 상태 변경일 경우 체크
-		if ("goodsStat".equals(goods.getProcJob()) && ("G008_40".equals(goods.getGoodsStat()) || "G008_90".equals(goods.getGoodsStat()))) {
-
-			// 이미지
-			Collection<Goods> goodsList = goodsService.getGoodsImgsYn(goods);
-
-			for (Goods tmpGoods : goodsList) {
-				if ("N".equals(tmpGoods.getGoodsImageYn())) {
-					returnGoods += tmpGoods.getGoodsCd() + ",";
-				} else {
-
-					// 택가/판매가 입력 여부 확인
-					Goods dataGoods = goodsService.getGoods(tmpGoods);
-					if (dataGoods == null) {
-						returnGoods += tmpGoods.getGoodsCd() + ",";
-						continue;
-					}
-					if (dataGoods.getListPrice() <= 0 || dataGoods.getCurrPrice() <= 0) {
-						returnGoods += tmpGoods.getGoodsCd() + ",";
-						continue;
-					}
-					// 사이즈 등록 여부 확인
-//					Stock stock = new Stock();
-//					stock.setGoodsCd(tmpGoods.getGoodsCd());
-//					int stockCnt = goodsService.getGoodsSizeCount(stock);
-//					if (stockCnt <= 0) {
-//						returnGoods += tmpGoods.getGoodsCd() + ",";
-//						continue;
-//					}
-
-					//고시정보
-//					GoodsNotiInfo goodsNotiInfo = new GoodsNotiInfo();
-//					goodsNotiInfo.setGoodsCd(tmpGoods.getGoodsCd());
-//					goodsNotiInfo.setSupplyCompCd(tmpGoods.getSupplyCompCd());
-//					goodsNotiInfo.setNiClsfCd(tmpGoods.getNiClsfCd());
-//					Collection<GoodsNotiInfo> goodsNotiInfoList = goodsService.getGoodsNotiInfoList(goodsNotiInfo);
-//					if (goodsNotiInfoList == null || goodsNotiInfoList.isEmpty()) {
-//						returnGoods += tmpGoods.getGoodsCd() + ",";
-//					} else {
-//						for (GoodsNotiInfo tmpGoodsNotiInfo : goodsNotiInfoList) {
-//							if ("Y".equals(tmpGoodsNotiInfo.getReqYn()) || "Y".equals(tmpGoodsNotiInfo.getDispYn())) {
-//								if (StringUtils.isEmpty(tmpGoodsNotiInfo.getNiContent())) {
-//									returnGoods += tmpGoods.getGoodsCd() + ",";
-//									break;
-//								}
-//							}
-//						}
-//					}
-				}
-			}
-
-			if (returnGoods.length() > 0) {
-				returnGoods = returnGoods.substring(0, returnGoods.lastIndexOf(","));
-				returnGoods = returnGoods.replaceAll(",", ",<br/>");
-				resultFlag = "FAIL";
-				result.set("resultFlag", resultFlag);
-				result.set("returnGoods", returnGoods);
-				return result;
-			}
-		}
-
-		goodsService.updateGoodsState(goods);
-
-		result.set("resultFlag", resultFlag);
-		result.set("returnGoods", returnGoods);
-		return result;
-	}
-
-	/**
-	 * 엑셀조회용 상품 저장
-	 *
-	 * @param goods
-	 * @return
-	 * @throws Exception
-	 * @author eskim
-	 * @since 2020. 10. 20
-	 */
-	@PostMapping("/search/excelupload/save")
-	@ResponseBody
-	public GagaResponse saveExceluploadGoods(@RequestBody Goods goods) throws Exception {
-
-		int cnt = 0;
-		ObjectMapper mapper = new ObjectMapper();
-
-		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
-
-		// DB 처리 시 사용되는 파라미터명(셀명) 설정
-		String[] cellName = {"goodsCd", "supplyGoodsCd"};
-
-		Collection<GagaMap> ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goods.getExcelFileNm()), 0, cellName, 0);
-
-		Collection<Goods> goodsList = new ArrayList<>();
-		for (GagaMap map : ecxelGoodsList) {
-			Goods tmpGoods = mapper.convertValue(map, Goods.class);
-			tmpGoods.setRegNo(TsaSession.getInfo().getUserNo());
-			tmpGoods.setProcJob(goods.getProcJob());
-			goodsList.add(tmpGoods);
-			cnt++;
-		}
-
-		goodsService.saveExceluploadGoods(goodsList, goods.getExcelFileNm());
-
-		// 파일 삭제
-		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, goods.getExcelFileNm()));
-
-		return super.ok("");
-	}
-
-	/**
-	 * 엑셀 업로드 상품 조회
-	 *
-	 * @param
-	 * @return GagaMap
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	@PostMapping("/excel/upload/goods/list")
-	@ResponseBody
-	public GagaMap getExcelUploadGoodsList() {
-		GagaMap result = new GagaMap();
-		GoodsSearch goodsSearch = new GoodsSearch();
-		goodsSearch.setSearchGb("EXCEL");
-		// 입점업체담당자는 업체코드 설정
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
-			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
-		}
-		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
-		result.set("goodsExcelList", goodsService.getGoodsList(goodsSearch));
-		return result;
-	}
-
-	/**
-	 * 상품 상세 화면
-	 *
-	 * @param goodsCode - 상품코드
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	@GetMapping("/detail/form")
-	@ResponseBody
-	public ModelAndView detailForm(Goods goods) {
-		ModelAndView mav = new ModelAndView();
-
-		String supplyCompCd = "";
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
-		}
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
-
-		String[] goodsStatExceptCds = {"G008_00"};
-		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", goodsStatExceptCds));
-
-		// 정상이월
-		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
-		// 성별
-		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
-		// 시즌
-		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
-		// 사용여부
-		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// 품목
-		mav.addObject("itemkindList", rendererService.getAllItemkindList());
-		// 정보고시 분류
-		mav.addObject("niClsfCdList", rendererService.getAvailCommonCodeList("G004"));
-		// 사용자 브랜드 조회
-		mav.addObject("authBrandList", rendererService.getAuthBrandList(TsaSession.getInfo().getUserNo()));
-		// 상품타입
-		mav.addObject("goodsTypeList", rendererService.getAvailCommonCodeList("G056"));
-		// 상품구분
-		mav.addObject("goodsGbList", rendererService.getAvailCommonCodeList("G073"));
-		// 유통구분
-		String[] distributionGbExceptCds = {"G065_20"};
-		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065", "Y", distributionGbExceptCds));
-		// 상품연령대
-		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
-		// 년도
-		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
-		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
-		// 색상
-		Color color = new Color();
-		mav.addObject("colorList", rendererService.getColorList(color));
-
-		mav.addObject("params", goods);
-
-		mav.setViewName("goods/GoodsDetailForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품 상세 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2019. 12. 11
-	 */
-	@PostMapping("/detail")
-	@ResponseBody
-	public Goods getGoodsDetail(Goods goods) {
-		return goodsService.getGoods(goods);
-	}
-
-	/**
-	 * 상품 이력 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2019. 12. 12
-	 */
-	@GetMapping("/detail/hst/list")
-	@ResponseBody
-	public Collection<GoodsHst> getGoodsDetailHstList(Goods goods) {
-		return goodsService.getGoodsHstList(goods);
-	}
-
-	/**
-	 * 컬러 옵셥 재고
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 26
-	 */
-	@PostMapping("/detail/sizeStock/form")
-	public ModelAndView getGoodsDetailSizeStockForm(Goods goods) {
-
-		ModelAndView mav = new ModelAndView();
-		mav.addObject("goods", goodsService.getGoods(goods));
-		mav.addObject("goodsSizeList", goodsService.getGoodsSizeList(goods));
-		// 사용여부
-		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-
-		mav.setViewName("goods/GoodsDetailSizeStockForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품 정보고시 조회
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2019. 12. 12
-	 */
-	@PostMapping("/detail/notiInfo/list")
-	@ResponseBody
-	public Collection<GoodsNotiInfo> getGoodsDetailNotiInfoList(Goods goods) {
-
-		GoodsNotiInfo goodsInfo = new GoodsNotiInfo();
-		goodsInfo.setGoodsCd(goods.getGoodsCd());
-		goodsInfo.setNiClsfCd(goods.getNiClsfCd());
-		goodsInfo.setSupplyCompCd(goods.getSupplyCompCd());
-
-		return goodsService.getGoodsNotiInfoList(goodsInfo);
-	}
-
-	/**
-	 * 구성상품 목록
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	@GetMapping("/detail/compose/list")
-	@ResponseBody
-	public Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods) {
-		return goodsService.getGoodsDetailComposeList(goods);
-	}
-
-	/**
-	 * 같은 품번 상품목록
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	@GetMapping("/detail/goodsNum/list")
-	@ResponseBody
-	public Collection<Goods> getGoodsNumGoodsList(Goods goods) {
-		return goodsService.getGoodsNumGoodsList(goods);
-	}
-
-	/**
-	 * 상품 상세 저장
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 27
-	 */
-	@PostMapping("/detail/save")
-	@ResponseBody
-	public GagaResponse saveGoodsDetail(@RequestBody Goods goods) {
-
-		// 상품상태에 따른 이미지 정보 확인 - 상품상태가 승인대기나 승인 완료일 경우
-		if ("G008_40".equals(goods.getGoodsStat()) || "G008_90".equals(goods.getGoodsStat())) {
-			Collection<Goods> goodsList = goodsService.getGoodsImgsYn(goods);
-			String goodsImageYn = "N";
-			for (Goods tmpGoods : goodsList) {
-				goodsImageYn = tmpGoods.getGoodsImageYn();
-			}
-			if ("N".equals(goodsImageYn)) {
-				throw new IllegalStateException("필수 이미지나 고시정보가 등록되지 않은 상품은 <br/>'승인대기'나 '승인완료' 상태로 변경할 수 없습니다.");
-			}
-		}
-
-		Collection<GoodsNotiInfo> notiList = null;
-		Collection<GoodsCompose> goodComposeList = null;
-		ObjectMapper mapper = new ObjectMapper();
-		try {
-			if (goods.getNotiList() != null) {
-				notiList = mapper.readValue(goods.getNotiList(), new TypeReference<Collection<GoodsNotiInfo>>() {
-				});
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		try {
-			if (goods.getGoodsComposeList() != null) {
-				goodComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
-				});
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		goods.setNotiListNew(notiList);
-		goods.setGoodsComposeListNew(goodComposeList);
-
-		goodsService.saveGoodsDetail(goods);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 세트상품구성 화면
-	 *
-	 * @param
-	 * @return
-	 * @author eskim
-	 * @since 2020. 05. 26
-	 */
-	@GetMapping("/set/form")
-	@ResponseBody
-	public ModelAndView setForm(Goods goods) {
-		ModelAndView mav = new ModelAndView();
-
-		// 사용여부
-		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// 정상이월
-		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
-		// 성별
-		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
-		// 시즌
-		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
-		// 스타일년도
-		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
-		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
-		// 매입유형
-		mav.addObject("buyingTypeList", rendererService.getAvailCommonCodeList("G035"));
-		// 색상
-		Color color = new Color();
-		mav.addObject("colorCdList", rendererService.getColorList(color));
-		// 상품상태
-		String[] exceptCds = {"G008_00"};
-		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
-
-		mav.addObject("params", goods);
-		mav.setViewName("goods/GoodsSetForm");
-		return mav;
-	}
-
-	/**
-	 * 세트 상품 등록
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 04
-	 */
-	@PostMapping("/set/save")
-	@ResponseBody
-	public GagaResponse saveGoodsSet(@RequestBody Goods goods) {
-		goodsService.saveGoodsSet(goods);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 딜상품구성 화면
-	 *
-	 * @param
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 29
-	 */
-	@GetMapping("/deal/form")
-	@ResponseBody
-	public ModelAndView dealForm(Goods goods) {
-		ModelAndView mav = new ModelAndView();
-
-		// 사용여부
-		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// 정상이월
-		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
-		// 성별
-		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
-		// 시즌
-		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
-		// 스타일년도
-		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
-		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
-		// 매입유형
-		mav.addObject("buyingTypeList", rendererService.getAvailCommonCodeList("G035"));
-		// 색상
-		Color color = new Color();
-		mav.addObject("colorCdList", rendererService.getColorList(color));
-		// 상품상태
-		// mav.addObject("goodsStatList",
-		// rendererService.getAvailCommonCodeList("G008"));
-		String[] exceptCds = {"G008_00"};
-		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
-
-		mav.addObject("params", goods);
-		mav.setViewName("goods/GoodsDealForm");
-		return mav;
-	}
-
-	/**
-	 * 딜 상품 등록
-	 *
-	 * @param goods
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	@PostMapping("/deal/save")
-	@ResponseBody
-	public GagaResponse saveGoodsDeal(@RequestBody Goods goods) {
-		goodsService.saveGoodsDeal(goods);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-
-	/**
-	 * 상품 대량 등록 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/mass/register/form")
-	public ModelAndView massRegisterForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("goods/GoodsMassRegisterForm");
-
-		return mav;
-	}
-
-	/**
-	 * WMS입고상품관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/wms/instock/form")
-	public ModelAndView wmsInstockForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("goods/GoodsWmsInstockForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품품목변경관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	@GetMapping("/itemkind/form")
-	public ModelAndView itemkindForm() {
-		ModelAndView mav = new ModelAndView();
-
-		String supplyCompCd = "";
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
-		}
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
-		// 시즌
-		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
-		// 년도
-		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
-		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
-		// 품목
-		mav.addObject("itemkindList", rendererService.getAllItemkindList());
-		// 카테고리 구분
-		mav.addObject("cateGbList", rendererService.getAvailCommonCodeList("G032"));
-		// MD
-		mav.addObject("brandMdList", rendererService.getBrandMdList());
-		// 정상이월
-		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
-
-		mav.setViewName("goods/GoodsItemkindForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품 품목 변경 저장
-	 *
-	 * @param goodsList
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 23
-	 */
-	@PostMapping("/itemKind/change/save")
-	@ResponseBody
-	public GagaResponse saveItemKindChange(@RequestBody Collection<Goods> goodsList) {
-		goodsService.saveItemKindChange(goodsList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-
-	/**
-	 * 상품 가격예약 관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/price/form")
-	public ModelAndView priceForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("goods/GoodsPriceForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품 타이틀예약관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	@GetMapping("/title/reserve/form")
-	public ModelAndView titleReserveForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 사이트
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-		String supplyCompCd = "";
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
-		}
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
-		// 상품상태
-		// mav.addObject("goodsStatList",
-		// rendererService.getAvailCommonCodeList("G008"));
-		String[] exceptCds = {"G008_00"};
-		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
-		// 정상이월
-		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
-		// 시즌
-		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
-		// 스타일년도
-		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
-		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
-		// 사용여부
-		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// 품목
-		mav.addObject("itemkindList", rendererService.getAllItemkindList());
-		// MD
-		mav.addObject("brandMdList", rendererService.getBrandMdList());
-
-		mav.setViewName("goods/GoodsTitleReserveForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품 타이틀 관리 조회
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 30
-	 */
-	@PostMapping("/title/reserve/list")
-	@ResponseBody
-	public GagaMap goodsTitleReserveList(@RequestBody GoodsSearch goodsSearch) {
-
-		GagaMap result = new GagaMap();
-
-		// 입점업체담당자는 업체코드 설정
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
-			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
-		}
-
-		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
-			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
-		}
-
-		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
-		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
-		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsTitleReserveCount(goodsSearch));
-
-		result.set("pageing", goodsSearch);
-		result.set("goodsTnmList", goodsService.getGoodsTitleReserveList(goodsSearch));
-
-		return result;
-	}
-
-	/**
-	 * 상품등록 타이틀 예약등록 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	@GetMapping("/title/reserve/popup/form")
-	@ResponseBody
-	public ModelAndView goodsRsvtTnmListForm(GoodsTnmRes goodsTnmRes) {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("goods/GoodsTitleReservePopupForm");
-		return mav;
-	}
-
-	/**
-	 * 상품 타이틀 예약 저장
-	 *
-	 * @param goodsTnmRes
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	@PostMapping("/title/reserve/save")
-	@ResponseBody
-	public GagaResponse saveGoodsRsvtTnm(@RequestBody GoodsTnmRes goodsTnmRes) {
-		goodsService.saveGoodsRsvtTnm(goodsTnmRes);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 상품 타이틀 예약 삭제
-	 *
-	 * @param goodsTnmRes
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 02
-	 */
-	@PostMapping("/title/reserve/delete")
-	@ResponseBody
-	public GagaResponse deleteGoodsRsvtTnm(@RequestBody GoodsTnmRes goodsTnmRes) {
-		goodsService.deleteGoodsRsvtTnm(goodsTnmRes);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-
-	/**
-	 * 상품 동영상관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/video/form")
-	public ModelAndView videoForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("goods/GoodsVideoForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품 EP제외상품관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	@GetMapping("/ep/skip/form")
-	public ModelAndView epSkipForm() {
-		ModelAndView mav = new ModelAndView();
-
-		String supplyCompCd = "";
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
-		}
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
-		// 상품상태
-		String[] exceptCds = {"G001_00"};
-		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
-		// 정상이월
-		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
-		// 시즌
-		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
-		// 년도
-		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
-		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
-		// 사용여부
-		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// 품목
-		mav.addObject("itemkindList", rendererService.getAllItemkindList());
-		// MD
-		mav.addObject("brandMdList", rendererService.getBrandMdList());
-
-		mav.setViewName("goods/GoodsEpSkipForm");
-
-		return mav;
-	}
-
-	/**
-	 * 네이버 EP 제외 상품 조회
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	@PostMapping("/ep/skip/list")
-	@ResponseBody
-	public GagaMap goodsEpSkipList(@RequestBody GoodsSearch goodsSearch) {
-
-		GagaMap result = new GagaMap();
-
-		// 입점업체담당자는 업체코드 설정
-		if ("B000".equals(TsaSession.getInfo().getRoleCd())) {
-			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
-			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
-		}
-
-		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
-			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
-		}
-
-		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
-		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
-		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsEpSkipCount(goodsSearch));
-
-		result.set("pageing", goodsSearch);
-		result.set("goodsEpSkipList", goodsService.getGoodsEpSkipList(goodsSearch));
-
-		return result;
-	}
-
-	/**
-	 * 네이버 EP 제외 상품 예약등록 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	@GetMapping("/ep/skip/popup/form")
-	@ResponseBody
-	public ModelAndView goodsEpSkipPopupForm(GoodsEpSkip goodsEpSkip) {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("goods/GoodsEpSkipPopupForm");
-		return mav;
-	}
-
-	/**
-	 * 네이버 EP 제외 상품 예약 저장
-	 *
-	 * @param goodsEpSkip
-	 * @return GagaResponse
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	@PostMapping("/rsvt/ep/skip/save")
-	@ResponseBody
-	public GagaResponse saveGoodsRsvtEpSkip(@RequestBody GoodsEpSkip goodsEpSkip) {
-		goodsService.saveGoodsRsvtEpSkip(goodsEpSkip);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 네이버 EP 제외 상품 예약 삭제
-	 *
-	 * @param goodsEpSkip
-	 * @return GagaResponse
-	 * @author eskim
-	 * @since 2020. 11. 03
-	 */
-	@PostMapping("/rsvt/ep/skip/delete")
-	@ResponseBody
-	public GagaResponse deleteGoodsEpSkip(@RequestBody GoodsEpSkip goodsEpSkip) {
-		goodsService.deleteGoodsEpSkip(goodsEpSkip);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-
-	/**
-	 * 상품 재입고알림관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/instock/alarm/form")
-	public ModelAndView instockAlarmForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("goods/GoodsInstockAlarmForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품 예약판매관리 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/reserve/sell/form")
-	public ModelAndView reserveSellForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("goods/GoodsReserveSellForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품 상세공지 화면
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 16
-	 */
-	@GetMapping("/detail/notice/form")
-	public ModelAndView detailNoticeForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
-
-		mav.setViewName("goods/GoodsDetailNoticeForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품 상세공지 목록
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 05
-	 */
-	@PostMapping("/notice/list")
-	@ResponseBody
-	public Collection<Notice> getNoticeList(@RequestBody GoodsSearch goodsSearch) {
-
-		// 입점업체담당자는 업체코드 설정
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
-			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
-		}
-
-		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
-			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
-		}
-
-		return goodsService.getNoticeList(goodsSearch);
-	}
-
-	/**
-	 * 상품 상세공지 상품목록
-	 * @param notice - 공지사항 정보
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 06
-	 */
-	@GetMapping("/notice/goods/list/{noticeSq}")
-	@ResponseBody
-	public Collection<NoticeGoods> getNoticeGoodsList(@PathVariable Integer noticeSq) {
-		Notice notice = new Notice();
-		notice.setNoticeSq(noticeSq);
-		return goodsService.getNoticeGoodsList(notice);
-	}
-
-	/**
-	 * 상품 상세공지 저장/등록
-	 *
-	 * @param
-	 * @return
-	 * @author eskim
-	 * @since 2020. 11. 05
-	 */
-	@PostMapping("/notice/save")
-	@ResponseBody
-	public GagaResponse saveNotice(@RequestBody Notice notice) {
-		goodsService.saveNotice(notice);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-
-	/**
-	 * 상품조회 팝업
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 26
-	 */
-	@GetMapping("/popup/list/form")
-	@ResponseBody
-	public ModelAndView relationListForm(GoodsSearch goodsSearch) {
-		ModelAndView mav = new ModelAndView();
-
-		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
-		// 상품상태
-		String[] exceptCds = {"G008_00"};
-		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
-		// 정상이월
-		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
-		// 성별
-		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
-		// 시즌
-		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
-		// 연령대
-		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
-		// 사용여부
-		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
-		// 품목
-		mav.addObject("itemkindList", rendererService.getAllItemkindList());
-		// 상품유형
-		mav.addObject("goodsTypeList", rendererService.getAvailCommonCodeList("G056"));
-		// MD
-		mav.addObject("brandMdList", rendererService.getBrandMdList());
-		// 년도
-		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
-		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
-
-		mav.addObject("params", goodsSearch);
-
-		mav.setViewName("goods/GoodsPopupListForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품조회 팝업 조회
-	 *
-	 * @return
-	 * @author eskim
-	 * @since 2020. 10. 26
-	 */
-	@PostMapping("/popup/list")
-	@ResponseBody
-	public GagaMap getPopupGoodsList(@RequestBody GoodsSearch goodsSearch) {
-
-		GagaMap result = new GagaMap();
-
-		// 입점업체담당자는 업체코드 설정
-		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
-			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
-			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
-		}
-
-		// multi row 검색관련 처리
-		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
-			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
-
-			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
-				goodsSearch.setSearchGb("EXTEND");
-			} else if ("searchMasterGoodsCd".equals(goodsSearch.getSearch())) {
-				goodsSearch.setSearchGb("MASTER");
-			}
-		}
-
-		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
-		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
-		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsListCount(goodsSearch));
-
-		result.set("pageing", goodsSearch);
-		result.set("goodsList", goodsService.getGoodsList(goodsSearch));
-
-		return result;
-	}
-
-}
+package com.style24.admin.biz.web;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.style24.admin.biz.service.TsaGoodsService;
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsCompose;
+import com.style24.persistence.domain.GoodsEpSkip;
+import com.style24.persistence.domain.GoodsHst;
+import com.style24.persistence.domain.GoodsNotiInfo;
+import com.style24.persistence.domain.GoodsSearch;
+import com.style24.persistence.domain.GoodsTnmRes;
+import com.style24.persistence.domain.Itemkind;
+import com.style24.persistence.domain.NotiInfo;
+import com.style24.persistence.domain.Notice;
+import com.style24.persistence.domain.NoticeGoods;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.excel.GagaExcelUtil;
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.gagaframework.web.util.GagaDateUtil;
+import com.gagaframework.web.util.GagaFileUtil;
+
+/**
+ * 상품관리 Controller
+ *
+ * @author eskim
+ * @since 2020. 10. 16
+ */
+@Controller
+@RequestMapping("/goods")
+@Slf4j
+public class TsaGoodsController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TsaGoodsService goodsService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	/**
+	 * 품목관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/itemkind/base/form")
+	public ModelAndView itemkindBaseForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 정보고시 목록
+		mav.addObject("niClsfCdList", rendererService.getAvailCommonCodeList("G004"));
+
+		mav.setViewName("goods/ItemkindBaseForm");
+
+		return mav;
+	}
+
+	/**
+	 * 품목관리 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@PostMapping("/itemkind/base/list")
+	@ResponseBody
+	public Collection<Itemkind> getItemkindList(@RequestBody Itemkind itemkind) {
+		return goodsService.getItemkindList(itemkind);
+	}
+
+	/**
+	 * 품목 관리 저장/등록
+	 *
+	 * @param itemkindList
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@PostMapping("/itemkind/save")
+	@ResponseBody
+	public GagaResponse saveItemkindInfo(@RequestBody Collection<Itemkind> itemkindList) {
+		goodsService.saveItemkindInfo(itemkindList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 품목관리 삭제
+	 *
+	 * @param itemkindList
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@PostMapping("/itemkind/delete")
+	@ResponseBody
+	public GagaResponse deleteItemkindInfo(@RequestBody Collection<Itemkind> itemkindList) {
+		goodsService.deleteItemkindInfo(itemkindList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 색상관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/color/form")
+	public ModelAndView colorForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 대표컬러목록
+		mav.addObject("groupColorCodeList", rendererService.getColorGrpCdRgbList());
+		// 대표컬러명목록
+		mav.addObject("groupColorCodeNmList", rendererService.getCommonCodeList("G072"));
+
+		mav.setViewName("goods/ColorForm");
+
+		return mav;
+	}
+
+	/**
+	 * 색상 조회
+	 *
+	 * @param color
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@PostMapping("/color/list")
+	@ResponseBody
+	public Collection<Color> getColorList(@RequestBody Color color) {
+		return goodsService.getColorList(color);
+	}
+
+	/**
+	 * 색상 저장
+	 *
+	 * @param color
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@PostMapping("/color/save")
+	@ResponseBody
+	public GagaResponse saveColor(@RequestBody Collection<Color> colorList) {
+
+		goodsService.saveColor(colorList);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	/**
+	 * 시즌관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/season/form")
+	public ModelAndView seasonForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/SeasonForm");
+
+		return mav;
+	}
+
+	/**
+	 * 고시정보관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/notiinfo/form")
+	public ModelAndView notiinfoForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 정보고시 분류별 항목
+		mav.addObject("niItemCdList", rendererService.getAvailCommonCodeList("G005"));
+		// 공급업체
+//		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
+
+		mav.setViewName("goods/NotiinfoForm");
+
+		return mav;
+	}
+
+	/**
+	 * 정보고시관리 조회
+	 *
+	 * @param notiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 19
+	 */
+	@PostMapping("/notiInfo/list")
+	@ResponseBody
+	public Collection<NotiInfo> getNotiInfoList(@RequestBody NotiInfo notiInfo) {
+		return goodsService.getNotiInfoList(notiInfo);
+	}
+
+	/**
+	 * 정보고시 항목 목록
+	 *
+	 * @param notiInfo
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 19
+	 */
+	@PostMapping("/notiInfo/item/list")
+	@ResponseBody
+	public Collection<NotiInfo> getNotiInfoItemList(@RequestBody NotiInfo notiInfo) {
+		return goodsService.getNotiInfoItemList(notiInfo);
+	}
+
+	/**
+	 * 정보고시 상세 저장
+	 *
+	 * @param notiInfoList
+	 * @return
+	 * @author eskim
+	 * @since 2010. 10. 19
+	 */
+	@PostMapping("/notiInfo/item/save")
+	@ResponseBody
+	public GagaResponse saveNotiInfoItem(@RequestBody Collection<NotiInfo> notiInfoList) {
+
+		goodsService.saveNotiInfoItem(notiInfoList);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 상품목록 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/list/form")
+	public ModelAndView listForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
+		// 상품상태
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 성별
+		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+		// 연령대
+		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 품목
+		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+		// 상품유형
+		mav.addObject("goodsTypeList", rendererService.getAvailCommonCodeList("G056"));
+		// MD
+		mav.addObject("brandMdList", rendererService.getBrandMdList());
+
+		mav.setViewName("goods/GoodsListForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품목록 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/list")
+	@ResponseBody
+	public GagaMap getGoodsList(@RequestBody GoodsSearch goodsSearch) {
+
+		GagaMap result = new GagaMap();
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
+		}
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+
+			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("EXTEND");
+			} else if ("searchMasterGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("MASTER");
+			}
+		}
+
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
+		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsListCount(goodsSearch));
+
+		result.set("pageing", goodsSearch);
+		result.set("goodsList", goodsService.getGoodsList(goodsSearch));
+
+		return result;
+	}
+
+	/**
+	 * 상품목록 - 기본정보 엑셀다운로드
+	 *
+	 * @param goodsSearch
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 21
+	 */
+	@GetMapping("/info/excel/list")
+	public ResponseEntity<InputStreamResource> downloadGoodsInfoExcelList(HttpServletRequest request, GoodsSearch goodsSearch) throws Exception {
+		String excelfileName = "상품_기본정보_" + GagaDateUtil.getTodayDateTime() + ".xlsx";
+		String excelFilenameWithPath = GagaFileUtil.getConcatenationPath(env.getProperty("download.path"), "excel", excelfileName);
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
+		}
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+
+			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("EXTEND");
+			} else if ("searchMasterGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("MASTER");
+			}
+		}
+
+		// 대용량엑셀파일다운로드는 이런 식으로 ...
+		goodsService.getGoodsInfoExcelList(goodsSearch, excelFilenameWithPath);
+
+		return GagaFileUtil.writeFile(request, excelFilenameWithPath);
+	}
+
+	/**
+	 * 상품 수정 항목 일괄변경
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 01. 17
+	 */
+	@PostMapping("/state/update")
+	@ResponseBody
+	public GagaMap updateGoodsState(@RequestBody Goods goods) {
+
+		GagaMap result = new GagaMap();
+		result.set("status", GagaResponseStatus.SUCCESS.getCode()); // 200
+		result.set("procJob", goods.getProcJob());
+		// result.set("message", message.getMessage("SUCC_0001"));
+
+		String returnGoods = "";
+		String resultFlag = "SUCC";
+
+		if (!"G001_0000".equals(TsaSession.getInfo().getRoleCd()) && !"G001_A000".equals(TsaSession.getInfo().getRoleCd())
+			&& !"G001_A001".equals(TsaSession.getInfo().getRoleCd()) && !"G001_A100".equals(TsaSession.getInfo().getRoleCd())
+			&& !"G001_A101".equals(TsaSession.getInfo().getRoleCd())) {
+			throw new IllegalStateException("권한이 없습니다.");
+		}
+
+		// 상품 상태 변경일 경우 체크
+		if ("goodsStat".equals(goods.getProcJob()) && ("G008_40".equals(goods.getGoodsStat()) || "G008_90".equals(goods.getGoodsStat()))) {
+
+			// 이미지
+			Collection<Goods> goodsList = goodsService.getGoodsImgsYn(goods);
+
+			for (Goods tmpGoods : goodsList) {
+				if ("N".equals(tmpGoods.getGoodsImageYn())) {
+					returnGoods += tmpGoods.getGoodsCd() + ",";
+				} else {
+
+					// 택가/판매가 입력 여부 확인
+					Goods dataGoods = goodsService.getGoods(tmpGoods);
+					if (dataGoods == null) {
+						returnGoods += tmpGoods.getGoodsCd() + ",";
+						continue;
+					}
+					if (dataGoods.getListPrice() <= 0 || dataGoods.getCurrPrice() <= 0) {
+						returnGoods += tmpGoods.getGoodsCd() + ",";
+						continue;
+					}
+					// 사이즈 등록 여부 확인
+//					Stock stock = new Stock();
+//					stock.setGoodsCd(tmpGoods.getGoodsCd());
+//					int stockCnt = goodsService.getGoodsSizeCount(stock);
+//					if (stockCnt <= 0) {
+//						returnGoods += tmpGoods.getGoodsCd() + ",";
+//						continue;
+//					}
+
+					//고시정보
+//					GoodsNotiInfo goodsNotiInfo = new GoodsNotiInfo();
+//					goodsNotiInfo.setGoodsCd(tmpGoods.getGoodsCd());
+//					goodsNotiInfo.setSupplyCompCd(tmpGoods.getSupplyCompCd());
+//					goodsNotiInfo.setNiClsfCd(tmpGoods.getNiClsfCd());
+//					Collection<GoodsNotiInfo> goodsNotiInfoList = goodsService.getGoodsNotiInfoList(goodsNotiInfo);
+//					if (goodsNotiInfoList == null || goodsNotiInfoList.isEmpty()) {
+//						returnGoods += tmpGoods.getGoodsCd() + ",";
+//					} else {
+//						for (GoodsNotiInfo tmpGoodsNotiInfo : goodsNotiInfoList) {
+//							if ("Y".equals(tmpGoodsNotiInfo.getReqYn()) || "Y".equals(tmpGoodsNotiInfo.getDispYn())) {
+//								if (StringUtils.isEmpty(tmpGoodsNotiInfo.getNiContent())) {
+//									returnGoods += tmpGoods.getGoodsCd() + ",";
+//									break;
+//								}
+//							}
+//						}
+//					}
+				}
+			}
+
+			if (returnGoods.length() > 0) {
+				returnGoods = returnGoods.substring(0, returnGoods.lastIndexOf(","));
+				returnGoods = returnGoods.replaceAll(",", ",<br/>");
+				resultFlag = "FAIL";
+				result.set("resultFlag", resultFlag);
+				result.set("returnGoods", returnGoods);
+				return result;
+			}
+		}
+
+		goodsService.updateGoodsState(goods);
+
+		result.set("resultFlag", resultFlag);
+		result.set("returnGoods", returnGoods);
+		return result;
+	}
+
+	/**
+	 * 엑셀조회용 상품 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @throws Exception
+	 * @author eskim
+	 * @since 2020. 10. 20
+	 */
+	@PostMapping("/search/excelupload/save")
+	@ResponseBody
+	public GagaResponse saveExceluploadGoods(@RequestBody Goods goods) throws Exception {
+
+		int cnt = 0;
+		ObjectMapper mapper = new ObjectMapper();
+
+		String targetPath = GagaFileUtil.getConcatenationPath(env.getProperty("upload.excel.target.path"), "excel");
+
+		// DB 처리 시 사용되는 파라미터명(셀명) 설정
+		String[] cellName = {"goodsCd", "supplyGoodsCd"};
+
+		Collection<GagaMap> ecxelGoodsList = GagaExcelUtil.getList(GagaFileUtil.getConcatenationPath(targetPath, goods.getExcelFileNm()), 0, cellName, 0);
+
+		Collection<Goods> goodsList = new ArrayList<>();
+		for (GagaMap map : ecxelGoodsList) {
+			Goods tmpGoods = mapper.convertValue(map, Goods.class);
+			tmpGoods.setRegNo(TsaSession.getInfo().getUserNo());
+			tmpGoods.setProcJob(goods.getProcJob());
+			goodsList.add(tmpGoods);
+			cnt++;
+		}
+
+		goodsService.saveExceluploadGoods(goodsList, goods.getExcelFileNm());
+
+		// 파일 삭제
+		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, goods.getExcelFileNm()));
+
+		return super.ok("");
+	}
+
+	/**
+	 * 엑셀 업로드 상품 조회
+	 *
+	 * @param
+	 * @return GagaMap
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	@PostMapping("/excel/upload/goods/list")
+	@ResponseBody
+	public GagaMap getExcelUploadGoodsList() {
+		GagaMap result = new GagaMap();
+		GoodsSearch goodsSearch = new GoodsSearch();
+		goodsSearch.setSearchGb("EXCEL");
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
+		}
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		result.set("goodsExcelList", goodsService.getGoodsList(goodsSearch));
+		return result;
+	}
+
+	/**
+	 * 상품 상세 화면
+	 *
+	 * @param goodsCode - 상품코드
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	@GetMapping("/detail/form")
+	@ResponseBody
+	public ModelAndView detailForm(Goods goods) {
+		ModelAndView mav = new ModelAndView();
+
+		String supplyCompCd = "";
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
+		}
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
+
+		String[] goodsStatExceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", goodsStatExceptCds));
+
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 성별
+		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 품목
+		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+		// 정보고시 분류
+		mav.addObject("niClsfCdList", rendererService.getAvailCommonCodeList("G004"));
+		// 사용자 브랜드 조회
+		mav.addObject("authBrandList", rendererService.getAuthBrandList(TsaSession.getInfo().getUserNo()));
+		// 상품타입
+		mav.addObject("goodsTypeList", rendererService.getAvailCommonCodeList("G056"));
+		// 상품구분
+		mav.addObject("goodsGbList", rendererService.getAvailCommonCodeList("G073"));
+		// 유통구분
+		String[] distributionGbExceptCds = {"G065_20"};
+		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065", "Y", distributionGbExceptCds));
+		// 상품연령대
+		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+		// 색상
+		Color color = new Color();
+		mav.addObject("colorList", rendererService.getColorList(color));
+
+		mav.addObject("params", goods);
+
+		mav.setViewName("goods/GoodsDetailForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품 상세 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2019. 12. 11
+	 */
+	@PostMapping("/detail")
+	@ResponseBody
+	public Goods getGoodsDetail(Goods goods) {
+		return goodsService.getGoods(goods);
+	}
+
+	/**
+	 * 상품 이력 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2019. 12. 12
+	 */
+	@GetMapping("/detail/hst/list")
+	@ResponseBody
+	public Collection<GoodsHst> getGoodsDetailHstList(Goods goods) {
+		return goodsService.getGoodsHstList(goods);
+	}
+
+	/**
+	 * 컬러 옵셥 재고
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 26
+	 */
+	@PostMapping("/detail/sizeStock/form")
+	public ModelAndView getGoodsDetailSizeStockForm(Goods goods) {
+
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("goods", goodsService.getGoods(goods));
+		mav.addObject("goodsSizeList", goodsService.getGoodsSizeList(goods));
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+
+		mav.setViewName("goods/GoodsDetailSizeStockForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품 정보고시 조회
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2019. 12. 12
+	 */
+	@PostMapping("/detail/notiInfo/list")
+	@ResponseBody
+	public Collection<GoodsNotiInfo> getGoodsDetailNotiInfoList(Goods goods) {
+
+		GoodsNotiInfo goodsInfo = new GoodsNotiInfo();
+		goodsInfo.setGoodsCd(goods.getGoodsCd());
+		goodsInfo.setNiClsfCd(goods.getNiClsfCd());
+		goodsInfo.setSupplyCompCd(goods.getSupplyCompCd());
+
+		return goodsService.getGoodsNotiInfoList(goodsInfo);
+	}
+
+	/**
+	 * 구성상품 목록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	@GetMapping("/detail/compose/list")
+	@ResponseBody
+	public Collection<GoodsCompose> getGoodsDetailComposeList(Goods goods) {
+		return goodsService.getGoodsDetailComposeList(goods);
+	}
+
+	/**
+	 * 같은 품번 상품목록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	@GetMapping("/detail/goodsNum/list")
+	@ResponseBody
+	public Collection<Goods> getGoodsNumGoodsList(Goods goods) {
+		return goodsService.getGoodsNumGoodsList(goods);
+	}
+
+	/**
+	 * 상품 상세 저장
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 27
+	 */
+	@PostMapping("/detail/save")
+	@ResponseBody
+	public GagaResponse saveGoodsDetail(@RequestBody Goods goods) {
+
+		// 상품상태에 따른 이미지 정보 확인 - 상품상태가 승인대기나 승인 완료일 경우
+		if ("G008_40".equals(goods.getGoodsStat()) || "G008_90".equals(goods.getGoodsStat())) {
+			Collection<Goods> goodsList = goodsService.getGoodsImgsYn(goods);
+			String goodsImageYn = "N";
+			for (Goods tmpGoods : goodsList) {
+				goodsImageYn = tmpGoods.getGoodsImageYn();
+			}
+			if ("N".equals(goodsImageYn)) {
+				throw new IllegalStateException("필수 이미지나 고시정보가 등록되지 않은 상품은 <br/>'승인대기'나 '승인완료' 상태로 변경할 수 없습니다.");
+			}
+		}
+
+		Collection<GoodsNotiInfo> notiList = null;
+		Collection<GoodsCompose> goodComposeList = null;
+		ObjectMapper mapper = new ObjectMapper();
+		try {
+			if (goods.getNotiList() != null) {
+				notiList = mapper.readValue(goods.getNotiList(), new TypeReference<Collection<GoodsNotiInfo>>() {
+				});
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		try {
+			if (goods.getGoodsComposeList() != null) {
+				goodComposeList = mapper.readValue(goods.getGoodsComposeList(), new TypeReference<Collection<GoodsCompose>>() {
+				});
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		goods.setNotiListNew(notiList);
+		goods.setGoodsComposeListNew(goodComposeList);
+
+		goodsService.saveGoodsDetail(goods);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 세트상품구성 화면
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2020. 05. 26
+	 */
+	@GetMapping("/set/form")
+	@ResponseBody
+	public ModelAndView setForm(Goods goods) {
+		ModelAndView mav = new ModelAndView();
+
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 성별
+		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 스타일년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+		// 매입유형
+		mav.addObject("buyingTypeList", rendererService.getAvailCommonCodeList("G035"));
+		// 색상
+		Color color = new Color();
+		mav.addObject("colorCdList", rendererService.getColorList(color));
+		// 상품상태
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+
+		mav.addObject("params", goods);
+		mav.setViewName("goods/GoodsSetForm");
+		return mav;
+	}
+
+	/**
+	 * 세트 상품 등록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 04
+	 */
+	@PostMapping("/set/save")
+	@ResponseBody
+	public GagaResponse saveGoodsSet(@RequestBody Goods goods) {
+		goodsService.saveGoodsSet(goods);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 딜상품구성 화면
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 29
+	 */
+	@GetMapping("/deal/form")
+	@ResponseBody
+	public ModelAndView dealForm(Goods goods) {
+		ModelAndView mav = new ModelAndView();
+
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 성별
+		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 스타일년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+		// 매입유형
+		mav.addObject("buyingTypeList", rendererService.getAvailCommonCodeList("G035"));
+		// 색상
+		Color color = new Color();
+		mav.addObject("colorCdList", rendererService.getColorList(color));
+		// 상품상태
+		// mav.addObject("goodsStatList",
+		// rendererService.getAvailCommonCodeList("G008"));
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+
+		mav.addObject("params", goods);
+		mav.setViewName("goods/GoodsDealForm");
+		return mav;
+	}
+
+	/**
+	 * 딜 상품 등록
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	@PostMapping("/deal/save")
+	@ResponseBody
+	public GagaResponse saveGoodsDeal(@RequestBody Goods goods) {
+		goodsService.saveGoodsDeal(goods);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+
+	/**
+	 * 상품 대량 등록 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/mass/register/form")
+	public ModelAndView massRegisterForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsMassRegisterForm");
+
+		return mav;
+	}
+
+	/**
+	 * WMS입고상품관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/wms/instock/form")
+	public ModelAndView wmsInstockForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsWmsInstockForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품품목변경관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	@GetMapping("/itemkind/form")
+	public ModelAndView itemkindForm() {
+		ModelAndView mav = new ModelAndView();
+
+		String supplyCompCd = "";
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
+		}
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+		// 품목
+		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+		// 카테고리 구분
+		mav.addObject("cateGbList", rendererService.getAvailCommonCodeList("G032"));
+		// MD
+		mav.addObject("brandMdList", rendererService.getBrandMdList());
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+
+		mav.setViewName("goods/GoodsItemkindForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품 품목 변경 저장
+	 *
+	 * @param goodsList
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 23
+	 */
+	@PostMapping("/itemKind/change/save")
+	@ResponseBody
+	public GagaResponse saveItemKindChange(@RequestBody Collection<Goods> goodsList) {
+		goodsService.saveItemKindChange(goodsList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+
+	/**
+	 * 상품 가격예약 관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/price/form")
+	public ModelAndView priceForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsPriceForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품 타이틀예약관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	@GetMapping("/title/reserve/form")
+	public ModelAndView titleReserveForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+		String supplyCompCd = "";
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
+		}
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
+		// 상품상태
+		// mav.addObject("goodsStatList",
+		// rendererService.getAvailCommonCodeList("G008"));
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 스타일년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 품목
+		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+		// MD
+		mav.addObject("brandMdList", rendererService.getBrandMdList());
+
+		mav.setViewName("goods/GoodsTitleReserveForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품 타이틀 관리 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 30
+	 */
+	@PostMapping("/title/reserve/list")
+	@ResponseBody
+	public GagaMap goodsTitleReserveList(@RequestBody GoodsSearch goodsSearch) {
+
+		GagaMap result = new GagaMap();
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
+		}
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+		}
+
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
+		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsTitleReserveCount(goodsSearch));
+
+		result.set("pageing", goodsSearch);
+		result.set("goodsTnmList", goodsService.getGoodsTitleReserveList(goodsSearch));
+
+		return result;
+	}
+
+	/**
+	 * 상품등록 타이틀 예약등록 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	@GetMapping("/title/reserve/popup/form")
+	@ResponseBody
+	public ModelAndView goodsRsvtTnmListForm(GoodsTnmRes goodsTnmRes) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsTitleReservePopupForm");
+		return mav;
+	}
+
+	/**
+	 * 상품 타이틀 예약 저장
+	 *
+	 * @param goodsTnmRes
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	@PostMapping("/title/reserve/save")
+	@ResponseBody
+	public GagaResponse saveGoodsRsvtTnm(@RequestBody GoodsTnmRes goodsTnmRes) {
+		goodsService.saveGoodsRsvtTnm(goodsTnmRes);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 상품 타이틀 예약 삭제
+	 *
+	 * @param goodsTnmRes
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 02
+	 */
+	@PostMapping("/title/reserve/delete")
+	@ResponseBody
+	public GagaResponse deleteGoodsRsvtTnm(@RequestBody GoodsTnmRes goodsTnmRes) {
+		goodsService.deleteGoodsRsvtTnm(goodsTnmRes);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+
+	/**
+	 * 상품 동영상관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/video/form")
+	public ModelAndView videoForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsVideoForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품 EP제외상품관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	@GetMapping("/ep/skip/form")
+	public ModelAndView epSkipForm() {
+		ModelAndView mav = new ModelAndView();
+
+		String supplyCompCd = "";
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			supplyCompCd = TsaSession.getInfo().getSupplyCompCd();
+		}
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(supplyCompCd));
+		// 상품상태
+		String[] exceptCds = {"G001_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 품목
+		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+		// MD
+		mav.addObject("brandMdList", rendererService.getBrandMdList());
+
+		mav.setViewName("goods/GoodsEpSkipForm");
+
+		return mav;
+	}
+
+	/**
+	 * 네이버 EP 제외 상품 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	@PostMapping("/ep/skip/list")
+	@ResponseBody
+	public GagaMap goodsEpSkipList(@RequestBody GoodsSearch goodsSearch) {
+
+		GagaMap result = new GagaMap();
+
+		// 입점업체담당자는 업체코드 설정
+		if ("B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
+		}
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+		}
+
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
+		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsEpSkipCount(goodsSearch));
+
+		result.set("pageing", goodsSearch);
+		result.set("goodsEpSkipList", goodsService.getGoodsEpSkipList(goodsSearch));
+
+		return result;
+	}
+
+	/**
+	 * 네이버 EP 제외 상품 예약등록 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	@GetMapping("/ep/skip/popup/form")
+	@ResponseBody
+	public ModelAndView goodsEpSkipPopupForm(GoodsEpSkip goodsEpSkip) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsEpSkipPopupForm");
+		return mav;
+	}
+
+	/**
+	 * 네이버 EP 제외 상품 예약 저장
+	 *
+	 * @param goodsEpSkip
+	 * @return GagaResponse
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	@PostMapping("/rsvt/ep/skip/save")
+	@ResponseBody
+	public GagaResponse saveGoodsRsvtEpSkip(@RequestBody GoodsEpSkip goodsEpSkip) {
+		goodsService.saveGoodsRsvtEpSkip(goodsEpSkip);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 네이버 EP 제외 상품 예약 삭제
+	 *
+	 * @param goodsEpSkip
+	 * @return GagaResponse
+	 * @author eskim
+	 * @since 2020. 11. 03
+	 */
+	@PostMapping("/rsvt/ep/skip/delete")
+	@ResponseBody
+	public GagaResponse deleteGoodsEpSkip(@RequestBody GoodsEpSkip goodsEpSkip) {
+		goodsService.deleteGoodsEpSkip(goodsEpSkip);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+
+	/**
+	 * 상품 재입고알림관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/instock/alarm/form")
+	public ModelAndView instockAlarmForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsInstockAlarmForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품 예약판매관리 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/reserve/sell/form")
+	public ModelAndView reserveSellForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("goods/GoodsReserveSellForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품 상세공지 화면
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 16
+	 */
+	@GetMapping("/detail/notice/form")
+	public ModelAndView detailNoticeForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
+
+		mav.setViewName("goods/GoodsDetailNoticeForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품 상세공지 목록
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 05
+	 */
+	@PostMapping("/notice/list")
+	@ResponseBody
+	public Collection<Notice> getNoticeList(@RequestBody GoodsSearch goodsSearch) {
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
+		}
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+		}
+
+		return goodsService.getNoticeList(goodsSearch);
+	}
+
+	/**
+	 * 상품 상세공지 상품목록
+	 * @param notice - 공지사항 정보
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 06
+	 */
+	@GetMapping("/notice/goods/list/{noticeSq}")
+	@ResponseBody
+	public Collection<NoticeGoods> getNoticeGoodsList(@PathVariable Integer noticeSq) {
+		Notice notice = new Notice();
+		notice.setNoticeSq(noticeSq);
+		return goodsService.getNoticeGoodsList(notice);
+	}
+
+	/**
+	 * 상품 상세공지 저장/등록
+	 *
+	 * @param
+	 * @return
+	 * @author eskim
+	 * @since 2020. 11. 05
+	 */
+	@PostMapping("/notice/save")
+	@ResponseBody
+	public GagaResponse saveNotice(@RequestBody Notice notice) {
+		goodsService.saveNotice(notice);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+
+	/**
+	 * 상품조회 팝업
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 26
+	 */
+	@GetMapping("/popup/list/form")
+	@ResponseBody
+	public ModelAndView relationListForm(GoodsSearch goodsSearch) {
+		ModelAndView mav = new ModelAndView();
+
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList());
+		// 상품상태
+		String[] exceptCds = {"G008_00"};
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", exceptCds));
+		// 정상이월
+		mav.addObject("formalGbList", rendererService.getAvailCommonCodeList("G009"));
+		// 성별
+		mav.addObject("sexGbList", rendererService.getAvailCommonCodeList("G007"));
+		// 시즌
+		mav.addObject("seasonList", rendererService.getAvailCommonCodeList("G006"));
+		// 연령대
+		mav.addObject("ageGrpCdList", rendererService.getAvailCommonCodeList("G023"));
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		// 품목
+		mav.addObject("itemkindList", rendererService.getAllItemkindList());
+		// 상품유형
+		mav.addObject("goodsTypeList", rendererService.getAvailCommonCodeList("G056"));
+		// MD
+		mav.addObject("brandMdList", rendererService.getBrandMdList());
+		// 년도
+		int toYear = Integer.parseInt(GagaDateUtil.getToday("yyyy")) - 4;
+		mav.addObject("styleYearList", rendererService.getYearList(toYear,0,5));
+
+		mav.addObject("params", goodsSearch);
+
+		mav.setViewName("goods/GoodsPopupListForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품조회 팝업 조회
+	 *
+	 * @return
+	 * @author eskim
+	 * @since 2020. 10. 26
+	 */
+	@PostMapping("/popup/list")
+	@ResponseBody
+	public GagaMap getPopupGoodsList(@RequestBody GoodsSearch goodsSearch) {
+
+		GagaMap result = new GagaMap();
+
+		// 입점업체담당자는 업체코드 설정
+		if ("G001_B000".equals(TsaSession.getInfo().getRoleCd())) {
+			goodsSearch.setSupplyCompCd(TsaSession.getInfo().getSupplyCompCd());
+			goodsSearch.setMdNo(TsaSession.getInfo().getUserNo());
+		}
+
+		// multi row 검색관련 처리
+		if (!StringUtils.isEmpty(goodsSearch.getCondition())) {
+			goodsSearch.setConditionList(goodsSearch.getCondition().replaceAll("\r", "").split("\n"));
+
+			if ("searchExtendGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("EXTEND");
+			} else if ("searchMasterGoodsCd".equals(goodsSearch.getSearch())) {
+				goodsSearch.setSearchGb("MASTER");
+			}
+		}
+
+		goodsSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		goodsSearch.setPageable(new TsaPageRequest(goodsSearch.getPageNo() - 1, goodsSearch.getPageSize()));
+		goodsSearch.getPageable().setTotalCount(goodsService.getGoodsListCount(goodsSearch));
+
+		result.set("pageing", goodsSearch);
+		result.set("goodsList", goodsService.getGoodsList(goodsSearch));
+
+		return result;
+	}
+
+}

+ 178 - 178
style24.admin/src/main/java/com/style24/admin/biz/web/TsaOcmController.java

@@ -1,178 +1,178 @@
-package com.style24.admin.biz.web;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import com.style24.admin.biz.service.TsaOcmService;
-import com.style24.admin.biz.service.TsaRendererService;
-import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.Extmall;
-import com.style24.persistence.domain.ExtmallNoti;
-import com.style24.persistence.domain.ExtmallPriceSync;
-
-import lombok.extern.slf4j.Slf4j;
-
-import com.gagaframework.web.rest.server.GagaResponse;
-
-/**
- * 영업망관리 Controller
- *
- * @author gagamel
- * @since 2020. 11. 5
- */
-@Controller
-@RequestMapping("/ocm")
-@Slf4j
-public class TsaOcmController extends TsaBaseController {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private TsaOcmService ocmService;
-
-	@Autowired
-	private TsaRendererService rendererService;
-
-	/**
-	 * 제휴몰관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	@GetMapping("/extmall/form")
-	public ModelAndView extmallForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 제휴몰벤더
-		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		mav.setViewName("ocm/ExtmallForm");
-
-		return mav;
-	}
-
-	/**
-	 * 제휴몰 목록
-	 * @param extmall - 제휴몰 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	@PostMapping("/extmall/list")
-	@ResponseBody
-	public Collection<Extmall> getExtmallList(@RequestBody Extmall extmall) {
-		return ocmService.getExtmallList(extmall);
-	}
-
-	/**
-	 * 제휴몰 등록/수정 처리
-	 * @param extmall - 제휴몰 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 5
-	 */
-	@PostMapping("/extmall/save")
-	@ResponseBody
-	public GagaResponse saveExtmall(@RequestBody Extmall extmall) {
-		ocmService.saveExtmall(extmall);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 제휴몰고시정보관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 6
-	 */
-	@GetMapping("/extmall/notiinfo/form")
-	public ModelAndView extmallNotiinfoForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 제휴몰벤더
-		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
-
-		mav.setViewName("ocm/ExtmallNotiinfoForm");
-
-		return mav;
-	}
-
-	/**
-	 * 제휴몰고시정보 목록
-	 * @param extmallNoti - 제휴몰고시정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 6
-	 */
-	@PostMapping("/extmall/notiinfo/list")
-	@ResponseBody
-	public Collection<ExtmallNoti> getExtmallNotiinfoList(@RequestBody ExtmallNoti extmallNoti) {
-		return ocmService.getExtmallNotiinfoList(extmallNoti);
-	}
-
-	/**
-	 * 제휴몰가격연계관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	@GetMapping("/extmall/price/sync/form")
-	public ModelAndView extmallPriceSyncForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 제휴몰벤더
-		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		mav.setViewName("ocm/ExtmallPriceSyncForm");
-
-		return mav;
-	}
-
-	/**
-	 * 제휴몰가격연계 목록
-	 * @param extmallPriceSync - 제휴몰가격연계 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	@PostMapping("/extmall/price/sync/list")
-	@ResponseBody
-	public Collection<ExtmallPriceSync> getExtmallPriceSyncList(@RequestBody ExtmallPriceSync extmallPriceSync) {
-		return ocmService.getExtmallPriceSyncList(extmallPriceSync);
-	}
-
-	/**
-	 * 제휴몰가격연계 등록/수정 처리
-	 * @param extmallPriceSyncList - 제휴몰가격연계 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 7
-	 */
-	@PostMapping("/extmall/price/sync/save")
-	@ResponseBody
-	public GagaResponse saveExtmallPriceSync(@RequestBody Collection<ExtmallPriceSync> extmallPriceSyncList) {
-		if (extmallPriceSyncList == null || extmallPriceSyncList.isEmpty()) {
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-		}
-
-		ocmService.saveExtmallPriceSync(extmallPriceSyncList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-}
+package com.style24.admin.biz.web;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.admin.biz.service.TsaOcmService;
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.Extmall;
+import com.style24.persistence.domain.ExtmallNoti;
+import com.style24.persistence.domain.ExtmallPriceSync;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.rest.server.GagaResponse;
+
+/**
+ * 영업망관리 Controller
+ *
+ * @author gagamel
+ * @since 2020. 11. 5
+ */
+@Controller
+@RequestMapping("/ocm")
+@Slf4j
+public class TsaOcmController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaOcmService ocmService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	/**
+	 * 제휴몰관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	@GetMapping("/extmall/form")
+	public ModelAndView extmallForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 제휴몰벤더
+		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		mav.setViewName("ocm/ExtmallForm");
+
+		return mav;
+	}
+
+	/**
+	 * 제휴몰 목록
+	 * @param extmall - 제휴몰 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	@PostMapping("/extmall/list")
+	@ResponseBody
+	public Collection<Extmall> getExtmallList(@RequestBody Extmall extmall) {
+		return ocmService.getExtmallList(extmall);
+	}
+
+	/**
+	 * 제휴몰 등록/수정 처리
+	 * @param extmall - 제휴몰 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 5
+	 */
+	@PostMapping("/extmall/save")
+	@ResponseBody
+	public GagaResponse saveExtmall(@RequestBody Extmall extmall) {
+		ocmService.saveExtmall(extmall);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 제휴몰고시정보관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 6
+	 */
+	@GetMapping("/extmall/notiinfo/form")
+	public ModelAndView extmallNotiinfoForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 제휴몰벤더
+		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
+
+		mav.setViewName("ocm/ExtmallNotiinfoForm");
+
+		return mav;
+	}
+
+	/**
+	 * 제휴몰고시정보 목록
+	 * @param extmallNoti - 제휴몰고시정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 6
+	 */
+	@PostMapping("/extmall/notiinfo/list")
+	@ResponseBody
+	public Collection<ExtmallNoti> getExtmallNotiinfoList(@RequestBody ExtmallNoti extmallNoti) {
+		return ocmService.getExtmallNotiinfoList(extmallNoti);
+	}
+
+	/**
+	 * 제휴몰가격연계관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@GetMapping("/extmall/price/sync/form")
+	public ModelAndView extmallPriceSyncForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 제휴몰벤더
+		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		mav.setViewName("ocm/ExtmallPriceSyncForm");
+
+		return mav;
+	}
+
+	/**
+	 * 제휴몰가격연계 목록
+	 * @param extmallPriceSync - 제휴몰가격연계 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@PostMapping("/extmall/price/sync/list")
+	@ResponseBody
+	public Collection<ExtmallPriceSync> getExtmallPriceSyncList(@RequestBody ExtmallPriceSync extmallPriceSync) {
+		return ocmService.getExtmallPriceSyncList(extmallPriceSync);
+	}
+
+	/**
+	 * 제휴몰가격연계 등록/수정 처리
+	 * @param extmallPriceSyncList - 제휴몰가격연계 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 7
+	 */
+	@PostMapping("/extmall/price/sync/save")
+	@ResponseBody
+	public GagaResponse saveExtmallPriceSync(@RequestBody Collection<ExtmallPriceSync> extmallPriceSyncList) {
+		if (extmallPriceSyncList == null || extmallPriceSyncList.isEmpty()) {
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+		}
+
+		ocmService.saveExtmallPriceSync(extmallPriceSyncList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+}

+ 203 - 203
style24.admin/src/main/java/com/style24/admin/biz/web/TsaRendererController.java

@@ -1,203 +1,203 @@
-package com.style24.admin.biz.web;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import com.style24.admin.biz.service.TsaRendererService;
-import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.persistence.domain.Color;
-import com.style24.persistence.domain.CommonCode;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 콤보박스, 체크박스, 라디오버튼 구성 시 필요한 Renderer Controller
- *
- * @author renderer
- * @since 2020. 10. 20
- */
-@Controller
-@RequestMapping("/renderer")
-@Slf4j
-public class TsaRendererController extends TsaBaseController {
-
-	@Autowired
-	private TsaRendererService rendererService;
-
-	/**
-	 * 공급업체 목록
-	 * @param brandGb - 브랜드구분(S:자사브랜드, E:입점브랜드)
-	 * @return
-	 * @author gagamel
-	 * @since 2019. 11. 4
-	 */
-	@GetMapping("/supply/company/list/{brandGb}")
-	@ResponseBody
-	public Collection<CommonCode> getSupplyCompanyList(@PathVariable String brandGb) {
-		return brandGb.equals("S") ? rendererService.getSelfSupplyCompanyList() : rendererService.getEntrSupplyCompanyList();
-	}
-
-	/**
-	 * 입점업체브랜드 목록
-	 * @param supplyCompCd - 입점업체관리일련번호
-	 * @return
-	 * @author gagamel
-	 * @since 2019. 6. 7
-	 */
-	@GetMapping("/supplyCompany/brand/list/{supplyCompCd}")
-	@ResponseBody
-	public Collection<CommonCode> getSupplyCompanyBrandList(@PathVariable String supplyCompCd) {
-		return rendererService.getSupplyCompanyBrandList(supplyCompCd);
-	}
-
-//
-//	/**
-//	 * 브랜드그룹별 브랜드 목록
-//	 * @param brandGrpNm - 브랜드그룹명
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 1. 10
-//	 */
-//	@GetMapping("/group/brand/list/{brandGrpNm}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getGroupBrandList(@PathVariable String brandGrpNm) {
-//		return rendererService.getGroupBrandList(brandGrpNm);
-//	}
-//
-//	/**
-//	 * 권한별 브랜드 목록
-//	 * @return
-//	 * @author eskim
-//	 * @since 2019. 6.17
-//	 */
-//	@GetMapping("/brand/AuthBrandlist")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getAuthBrandList() {
-//		return rendererService.getAuthBrandList(AdmSession.getInfo().getUserId());
-//	}
-
-	/**
-	 * 출고처 목록
-	 * @param supplyCompCd - 공급업체코드
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 4
-	 */
-	@GetMapping("/delvloc/list/{supplyCompCd}")
-	@ResponseBody
-	public Collection<CommonCode> getDeliveryLocList(@PathVariable String supplyCompCd) {
-		return rendererService.getDeliveryLocList(supplyCompCd);
-	}
-
-//	/**
-//	 * 벤더외부몰 목록
-//	 * @param vendorId - 벤더ID
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2019. 8. 11
-//	 */
-//	@GetMapping("/vendor/extmall/list/{vendorId}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getVendorExtmallList(@PathVariable String vendorId) {
-//		return rendererService.getVendorExtmallList(vendorId);
-//	}
-//
-//	/**
-//	 * 벤더외부몰판매매장 목록
-//	 * @param vendorId - 벤더ID
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 4. 28
-//	 */
-//	@GetMapping("/vendor/extmall/sellStore/list/{vendorId}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getVendorExtmallSellStoreList(@PathVariable String vendorId) {
-//		return rendererService.getVendorExtmallSellStoreList(vendorId);
-//	}
-//
-//	/**
-//	 * 현재 유효한 공통코드 목록
-//	 * @param cdGb - 공통그룹코드
-//	 * @return
-//	 * @author eskim
-//	 * @since 2020. 01. 22
-//	 */
-//	@GetMapping("/avail/commonCode/list/{cdGb}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getAvailCommonCodeList(@PathVariable String cdGb) {
-//		return rendererService.getAvailCommonCodeList(cdGb);
-//	}
-//
-	/**
-	 * 업체별 색상 목록
-	 * @param cdGb - 공통그룹코드
-	 * @return
-	 * @author eskim
-	 * @since 2020. 01. 22
-	 */
-	@GetMapping("/avail/color/list")
-	@ResponseBody
-	public Collection<CommonCode> getColorList() {
-		Color color = new Color();
-		return rendererService.getColorList(color);
-	}
-//
-//	/**
-//	 * MD별 브랜드 목록
-//	 * @param mdId - 엠디아이디
-//	 * @return
-//	 * @author jaewonho
-//	 * @since 2020. 02. 11
-//	 */
-//	@GetMapping("/md/brand/list/{mdId}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getMdBrandList(@PathVariable String mdId) {
-//		return rendererService.getMdBrandList(mdId);
-//	}
-//
-//	/**
-//	 * MD별 브랜드그룹 목록
-//	 * @param mdId - 엠디아이디
-//	 * @return
-//	 * @author jaewonho
-//	 * @since 2020. 02. 11
-//	 */
-//	@GetMapping("/md/brand/grp/list/{mdId}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getMdBrandGrpList(@PathVariable String mdId) {
-//		return rendererService.getMdBrandGrpList(mdId);
-//	}
-//
-//	/**
-//	 * 판매몰 목록
-//	 * @param
-//	 * @return
-//	 * @author swkim
-//	 * @since 2020. 03. 19
-//	 */
-//	@GetMapping("/sellStore/list")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getSellStoreList() {
-//		return rendererService.getSellStoreList();
-//	}
-//
-//	/**
-//	 * 제휴링크 목록
-//	 * @param afChannel - 제휴채널
-//	 * @return
-//	 * @author gagamel
-//	 * @since 2020. 5. 4
-//	 */
-//	@GetMapping("/aflink/list/{afChannel}")
-//	@ResponseBody
-//	public Collection<AdmCommonCode> getAflinkList(@PathVariable String afChannel) {
-//		return rendererService.getAflinkList(afChannel);
-//	}
-
-}
+package com.style24.admin.biz.web;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.persistence.domain.Color;
+import com.style24.persistence.domain.CommonCode;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 콤보박스, 체크박스, 라디오버튼 구성 시 필요한 Renderer Controller
+ *
+ * @author renderer
+ * @since 2020. 10. 20
+ */
+@Controller
+@RequestMapping("/renderer")
+@Slf4j
+public class TsaRendererController extends TsaBaseController {
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	/**
+	 * 공급업체 목록
+	 * @param brandGb - 브랜드구분(S:자사브랜드, E:입점브랜드)
+	 * @return
+	 * @author gagamel
+	 * @since 2019. 11. 4
+	 */
+	@GetMapping("/supply/company/list/{brandGb}")
+	@ResponseBody
+	public Collection<CommonCode> getSupplyCompanyList(@PathVariable String brandGb) {
+		return brandGb.equals("S") ? rendererService.getSelfSupplyCompanyList() : rendererService.getEntrSupplyCompanyList();
+	}
+
+	/**
+	 * 입점업체브랜드 목록
+	 * @param supplyCompCd - 입점업체관리일련번호
+	 * @return
+	 * @author gagamel
+	 * @since 2019. 6. 7
+	 */
+	@GetMapping("/supplyCompany/brand/list/{supplyCompCd}")
+	@ResponseBody
+	public Collection<CommonCode> getSupplyCompanyBrandList(@PathVariable String supplyCompCd) {
+		return rendererService.getSupplyCompanyBrandList(supplyCompCd);
+	}
+
+//
+//	/**
+//	 * 브랜드그룹별 브랜드 목록
+//	 * @param brandGrpNm - 브랜드그룹명
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 1. 10
+//	 */
+//	@GetMapping("/group/brand/list/{brandGrpNm}")
+//	@ResponseBody
+//	public Collection<AdmCommonCode> getGroupBrandList(@PathVariable String brandGrpNm) {
+//		return rendererService.getGroupBrandList(brandGrpNm);
+//	}
+//
+//	/**
+//	 * 권한별 브랜드 목록
+//	 * @return
+//	 * @author eskim
+//	 * @since 2019. 6.17
+//	 */
+//	@GetMapping("/brand/AuthBrandlist")
+//	@ResponseBody
+//	public Collection<AdmCommonCode> getAuthBrandList() {
+//		return rendererService.getAuthBrandList(AdmSession.getInfo().getUserId());
+//	}
+
+	/**
+	 * 출고처 목록
+	 * @param supplyCompCd - 공급업체코드
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 4
+	 */
+	@GetMapping("/delvloc/list/{supplyCompCd}")
+	@ResponseBody
+	public Collection<CommonCode> getDeliveryLocList(@PathVariable String supplyCompCd) {
+		return rendererService.getDeliveryLocList(supplyCompCd);
+	}
+
+//	/**
+//	 * 벤더외부몰 목록
+//	 * @param vendorId - 벤더ID
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2019. 8. 11
+//	 */
+//	@GetMapping("/vendor/extmall/list/{vendorId}")
+//	@ResponseBody
+//	public Collection<AdmCommonCode> getVendorExtmallList(@PathVariable String vendorId) {
+//		return rendererService.getVendorExtmallList(vendorId);
+//	}
+//
+//	/**
+//	 * 벤더외부몰판매매장 목록
+//	 * @param vendorId - 벤더ID
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 4. 28
+//	 */
+//	@GetMapping("/vendor/extmall/sellStore/list/{vendorId}")
+//	@ResponseBody
+//	public Collection<AdmCommonCode> getVendorExtmallSellStoreList(@PathVariable String vendorId) {
+//		return rendererService.getVendorExtmallSellStoreList(vendorId);
+//	}
+//
+//	/**
+//	 * 현재 유효한 공통코드 목록
+//	 * @param cdGb - 공통그룹코드
+//	 * @return
+//	 * @author eskim
+//	 * @since 2020. 01. 22
+//	 */
+//	@GetMapping("/avail/commonCode/list/{cdGb}")
+//	@ResponseBody
+//	public Collection<AdmCommonCode> getAvailCommonCodeList(@PathVariable String cdGb) {
+//		return rendererService.getAvailCommonCodeList(cdGb);
+//	}
+//
+	/**
+	 * 업체별 색상 목록
+	 * @param cdGb - 공통그룹코드
+	 * @return
+	 * @author eskim
+	 * @since 2020. 01. 22
+	 */
+	@GetMapping("/avail/color/list")
+	@ResponseBody
+	public Collection<CommonCode> getColorList() {
+		Color color = new Color();
+		return rendererService.getColorList(color);
+	}
+//
+//	/**
+//	 * MD별 브랜드 목록
+//	 * @param mdId - 엠디아이디
+//	 * @return
+//	 * @author jaewonho
+//	 * @since 2020. 02. 11
+//	 */
+//	@GetMapping("/md/brand/list/{mdId}")
+//	@ResponseBody
+//	public Collection<AdmCommonCode> getMdBrandList(@PathVariable String mdId) {
+//		return rendererService.getMdBrandList(mdId);
+//	}
+//
+//	/**
+//	 * MD별 브랜드그룹 목록
+//	 * @param mdId - 엠디아이디
+//	 * @return
+//	 * @author jaewonho
+//	 * @since 2020. 02. 11
+//	 */
+//	@GetMapping("/md/brand/grp/list/{mdId}")
+//	@ResponseBody
+//	public Collection<AdmCommonCode> getMdBrandGrpList(@PathVariable String mdId) {
+//		return rendererService.getMdBrandGrpList(mdId);
+//	}
+//
+//	/**
+//	 * 판매몰 목록
+//	 * @param
+//	 * @return
+//	 * @author swkim
+//	 * @since 2020. 03. 19
+//	 */
+//	@GetMapping("/sellStore/list")
+//	@ResponseBody
+//	public Collection<AdmCommonCode> getSellStoreList() {
+//		return rendererService.getSellStoreList();
+//	}
+//
+//	/**
+//	 * 제휴링크 목록
+//	 * @param afChannel - 제휴채널
+//	 * @return
+//	 * @author gagamel
+//	 * @since 2020. 5. 4
+//	 */
+//	@GetMapping("/aflink/list/{afChannel}")
+//	@ResponseBody
+//	public Collection<AdmCommonCode> getAflinkList(@PathVariable String afChannel) {
+//		return rendererService.getAflinkList(afChannel);
+//	}
+
+}

+ 169 - 169
style24.admin/src/main/java/com/style24/admin/biz/web/TsaSettleController.java

@@ -1,169 +1,169 @@
-package com.style24.admin.biz.web;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.ModelAndView;
-
-import com.style24.admin.biz.service.TsaBusinessService;
-import com.style24.admin.biz.service.TsaRendererService;
-import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 정산 Controller
- *
- * @author jaewonHo
- * @since 2020. 10. 22
- */
-@Controller
-@RequestMapping("/settle")
-@Slf4j
-public class TsaSettleController extends TsaBaseController {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private TsaBusinessService businessService;
-
-	@Autowired
-	private TsaRendererService rendererService;
-
-	/**
-	 * 상품정산 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 22
-	 */
-	@GetMapping("/goods/form")
-	public ModelAndView goodsSettleForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		// 유통구분
-		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065"));
-
-		mav.setViewName("settle/GoodsSettleForm");
-
-		return mav;
-	}
-
-	/**
-	 * 배송비정산 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 22
-	 **/
-	@GetMapping("/delivery/fee/form")
-	public ModelAndView deliveryFeeSettleForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		// 유통구분
-		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065"));
-
-		mav.setViewName("settle/DeliveryFeeSettleForm");
-
-		return mav;
-	}
-
-	/**
-	 * 정산확정관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 22
-	 */
-	@GetMapping("/confirm/form")
-	public ModelAndView settleConfirmForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		// 유통구분
-		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065"));
-
-		// 은행
-		mav.addObject("bankList", rendererService.getCommonCodeList("G940"));
-
-		mav.setViewName("settle/SettleConfirmForm");
-
-		return mav;
-	}
-
-	/**
-	 * 업체별정산내역 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 22
-	 */
-	@GetMapping("/supply/company/form")
-	public ModelAndView supplyCompanySettleForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		mav.setViewName("settle/SupplyCompanySettleForm");
-
-		return mav;
-	}
-
-	/**
-	 * PG입금정산 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 22
-	 */
-	@GetMapping("/pg/deposit/form")
-	public ModelAndView paygateDepositForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		// PG구분
-		mav.addObject("pgGbList", rendererService.getCommonCodeList("G015"));
-
-		// 결제수단
-		mav.addObject("payMeansList", rendererService.getCommonCodeList("G014"));
-
-		mav.setViewName("settle/PgDepositSettleForm");
-
-		return mav;
-	}
-
-	/**
-	 * 상품권정산 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 22
-	 */
-	@GetMapping("/giftcard/form")
-	public ModelAndView giftcardForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		// PG구분
-		mav.addObject("pgGbList", rendererService.getCommonCodeList("G015"));
-
-		// 결제수단
-		mav.addObject("payMeansList", rendererService.getCommonCodeList("G014"));
-
-		mav.setViewName("settle/GiftcardSettleForm");
-
-		return mav;
-	}
-
-}
+package com.style24.admin.biz.web;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.admin.biz.service.TsaBusinessService;
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 정산 Controller
+ *
+ * @author jaewonHo
+ * @since 2020. 10. 22
+ */
+@Controller
+@RequestMapping("/settle")
+@Slf4j
+public class TsaSettleController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private TsaBusinessService businessService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	/**
+	 * 상품정산 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 22
+	 */
+	@GetMapping("/goods/form")
+	public ModelAndView goodsSettleForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// 유통구분
+		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065"));
+
+		mav.setViewName("settle/GoodsSettleForm");
+
+		return mav;
+	}
+
+	/**
+	 * 배송비정산 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 22
+	 **/
+	@GetMapping("/delivery/fee/form")
+	public ModelAndView deliveryFeeSettleForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// 유통구분
+		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065"));
+
+		mav.setViewName("settle/DeliveryFeeSettleForm");
+
+		return mav;
+	}
+
+	/**
+	 * 정산확정관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 22
+	 */
+	@GetMapping("/confirm/form")
+	public ModelAndView settleConfirmForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// 유통구분
+		mav.addObject("distributionGbList", rendererService.getCommonCodeList("G065"));
+
+		// 은행
+		mav.addObject("bankList", rendererService.getCommonCodeList("G940"));
+
+		mav.setViewName("settle/SettleConfirmForm");
+
+		return mav;
+	}
+
+	/**
+	 * 업체별정산내역 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 22
+	 */
+	@GetMapping("/supply/company/form")
+	public ModelAndView supplyCompanySettleForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		mav.setViewName("settle/SupplyCompanySettleForm");
+
+		return mav;
+	}
+
+	/**
+	 * PG입금정산 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 22
+	 */
+	@GetMapping("/pg/deposit/form")
+	public ModelAndView paygateDepositForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// PG구분
+		mav.addObject("pgGbList", rendererService.getCommonCodeList("G015"));
+
+		// 결제수단
+		mav.addObject("payMeansList", rendererService.getCommonCodeList("G014"));
+
+		mav.setViewName("settle/PgDepositSettleForm");
+
+		return mav;
+	}
+
+	/**
+	 * 상품권정산 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 22
+	 */
+	@GetMapping("/giftcard/form")
+	public ModelAndView giftcardForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// PG구분
+		mav.addObject("pgGbList", rendererService.getCommonCodeList("G015"));
+
+		// 결제수단
+		mav.addObject("payMeansList", rendererService.getCommonCodeList("G014"));
+
+		mav.setViewName("settle/GiftcardSettleForm");
+
+		return mav;
+	}
+
+}

+ 422 - 422
style24.admin/src/main/java/com/style24/admin/biz/web/TsaSystemController.java

@@ -1,422 +1,422 @@
-package com.style24.admin.biz.web;
-
-import java.util.Collection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
-import com.style24.admin.biz.service.TsaRendererService;
-import com.style24.admin.biz.service.TsaSystemService;
-import com.style24.admin.support.controller.TsaBaseController;
-import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.persistence.domain.CommonCode;
-import com.style24.persistence.domain.Menu;
-import com.style24.persistence.domain.SampleFile;
-import com.style24.persistence.domain.User;
-import com.style24.persistence.domain.UserMenu;
-
-import lombok.extern.slf4j.Slf4j;
-
-import com.gagaframework.web.core.security.GagaPasswordEncoder;
-import com.gagaframework.web.rest.server.GagaResponse;
-
-/**
- * 운영관리 Controller
- *
- * @author gagamel
- * @since 2020. 10. 7
- */
-@Controller
-@RequestMapping("/system")
-@Slf4j
-public class TsaSystemController extends TsaBaseController {
-
-	@Autowired
-	private TscMessageByLocale message;
-
-	@Autowired
-	private Environment env;
-
-	@Autowired
-	private TsaSystemService systemService;
-
-	@Autowired
-	private TsaRendererService rendererService;
-
-	@Autowired
-	private GagaPasswordEncoder passwordEncoder;
-
-	@Value("${upload.default.target.path}")
-	private String uploadTargetPath;
-
-	/**
-	 * 사용자관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@GetMapping("/user/form")
-	public ModelAndView userForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 공급업체 콤보박스 목록
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		// 권한 콤보박스 목록
-		mav.addObject("roleList", rendererService.getCommonCodeList("G001"));
-
-		mav.setViewName("system/UserForm");
-
-		return mav;
-	}
-
-	/**
-	 * 사용자 목록
-	 * @param user - 사용자 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@PostMapping("/user/list")
-	@ResponseBody
-	public Collection<User> getUserList(@RequestBody User user) {
-		return systemService.getUserList(user);
-	}
-
-	/**
-	 * 사용자 목록 삭제 처리
-	 * @param userList - 사용자 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@PostMapping("/user/list/delete")
-	@ResponseBody
-	public GagaResponse deleteUserList(@RequestBody Collection<User> userList) {
-		if (userList == null || userList.isEmpty())
-			throw new IllegalStateException(message.getMessage("FAIL_1001"));
-
-		systemService.deleteUserList(userList);
-
-		return super.ok(message.getMessage("SUCC_0003"));
-	}
-
-	/**
-	 * 사용자 정보 조회
-	 * @param mode   - 모드(N:신규, U:상세/수정, C:복사)
-	 * @param userNo - 사용자번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@GetMapping("/user/info/form")
-	public ModelAndView getUser(@RequestParam(value = "mode") String mode,
-		@RequestParam(value = "userNo", required = false) Integer userNo) {
-		ModelAndView mav = new ModelAndView();
-
-		// 권한 콤보박스 목록
-		if (!TsaSession.getInfo().getRoleCd().equals("0000")) {
-			mav.addObject("roleList", rendererService.getCommonCodeList("G001", "Y", new String[] {"0000"}));
-		} else {
-			mav.addObject("roleList", rendererService.getAvailCommonCodeList("G001"));
-		}
-
-		// 공급업체 콤보박스 목록
-		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
-
-		// 외부몰벤더 콤보박스 목록
-		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
-
-		if (mode.equals("U")) {
-			// 어드민사용자정보
-			mav.addObject("userInfo", systemService.getUser(userNo));
-		} else {
-			mav.addObject("userInfo", new User());
-		}
-
-		mav.addObject("mode", mode);
-
-		mav.setViewName("system/UserDetailForm");
-
-		return mav;
-	}
-
-	/**
-	 * 사용자ID 조회
-	 * @param userId - 사용자ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@GetMapping("/user/id/{userId}")
-	@ResponseBody
-	public int getUserIdCount(@PathVariable("userId") String userId) {
-		return systemService.getUserIdCount(userId);
-	}
-
-	/**
-	 * 사용자 저장 처리
-	 * @param user - 사용자 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@PostMapping("/user/save")
-	@ResponseBody
-	public GagaResponse saveUser(@RequestBody User user) {
-		if (user.getMode().equals("N")) { // 신규등록
-			user.setPasswd(passwordEncoder.encode(user.getPasswd()));
-		}
-
-		systemService.saveUser(user);
-
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 사용자 비밀번호 변경
-	 * @param user - 사용자 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@PostMapping("/user/password/change")
-	@ResponseBody
-	public GagaResponse changePassword(@RequestBody User user) {
-		user.setPasswd(passwordEncoder.encode(user.getPasswd()));
-		user.setUpdNo(TsaSession.getInfo().getUserNo());
-		log.info("user: {}", user);
-
-		// 어드민사용자 비밀번호 수정
-		systemService.updateUserPassword(user);
-
-		return super.ok(message.getMessage("SUCC_0009"));
-	}
-
-	/**
-	 * 사용자 메뉴 관리 화면
-	 * @param userNo - 사용자번호
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@GetMapping("/user/menu/{userNo}")
-	public ModelAndView getAdminUserMenu(@PathVariable("userNo") Integer userNo) {
-		ModelAndView mav = new ModelAndView();
-
-		// 사용자 메뉴 목록
-		mav.addObject("userMenuList", systemService.getUserMenuList(userNo));
-
-		mav.setViewName("system/UserMenuForm");
-
-		return mav;
-	}
-
-	/**
-	 * 사용자 메뉴 목록 저장 처리
-	 * @param menuList - 사용자 메뉴 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@PostMapping("/user/menu/list/save")
-	@ResponseBody
-	public GagaResponse saveUserMenuList(@RequestBody Collection<UserMenu> menuList) {
-		systemService.saveUserMenuList(menuList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 비밀번호 변경 팝업
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 30
-	 */
-	@GetMapping("/password/change/form")
-	public ModelAndView passwordChangeForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("system/PasswordChangeForm");
-
-		return mav;
-	}
-
-	/**
-	 * 메뉴관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@GetMapping("/menu/form")
-	public ModelAndView menuListForm() {
-		ModelAndView mav = new ModelAndView();
-
-		// 최상위메뉴 콤보박스 목록
-		mav.addObject("topMenuList", rendererService.getTopMenuList(""));
-
-		// 전체메뉴 콤보박스 목록
-		mav.addObject("allMenuList", rendererService.getAllMenuList());
-
-		// 권한 콤보박스 목록
-		mav.addObject("roleList", rendererService.getCommonCodeList("G001"));
-
-		mav.setViewName("system/MenuForm");
-
-		return mav;
-	}
-
-	/**
-	 * 메뉴 목록
-	 * @param pmenuId - 상위메뉴ID
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@GetMapping("/menu/list")
-	@ResponseBody
-	public Collection<Menu> getMenuList(@RequestParam(value = "pmenuId", required = false) String pmenuId) {
-		return systemService.getMenuList(pmenuId);
-	}
-
-	/**
-	 * 메뉴 사용안함 처리
-	 * @param menuList - 메뉴 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@PostMapping("/menu/list/save")
-	@ResponseBody
-	public GagaResponse saveMenuList(@RequestBody Collection<Menu> menuList) {
-		systemService.saveMenuList(menuList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 메뉴 등록/수정 처리
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@PostMapping("/menu/save")
-	@ResponseBody
-	public GagaResponse saveMenu(@RequestBody Menu menu) {
-		systemService.saveMenu(menu);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 공통코드관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@GetMapping("/commoncode/form")
-	public ModelAndView commoncodeListForm() {
-		ModelAndView mav = new ModelAndView();
-
-//		// 코드구분 콤보박스 목록
-//		mav.addObject("cdGbList", rendererService.getCommonCodeList("ROOT"));
-
-		mav.setViewName("system/CommoncodeForm");
-
-		return mav;
-	}
-
-	/**
-	 * 공통코드 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@GetMapping("/commoncode/list")
-	@ResponseBody
-	public Collection<CommonCode> getCommonCodeList(@RequestParam(value = "cdGb", required = false) String cdGb) {
-		CommonCode commoncode = new CommonCode();
-		commoncode.setCdGb(cdGb);
-		return systemService.getCommonCodeList(commoncode);
-	}
-
-	/**
-	 * 공통코드 목록 저장 처리
-	 * @param commonCodeList - 공통코드 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@PostMapping("/commoncode/list/save")
-	@ResponseBody
-	public GagaResponse saveCommonCodeList(@RequestBody Collection<CommonCode> commonCodeList) {
-		systemService.saveCommonCodeList(commonCodeList);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 공통코드 저장 처리
-	 * @param commonCode - 공통코드 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 10. 7
-	 */
-	@PostMapping("/commoncode/save")
-	@ResponseBody
-	public GagaResponse saveCommonCode(@RequestBody CommonCode commonCode) {
-		systemService.saveCommonCode(commonCode);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-	/**
-	 * 샘플양식관리 화면
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@GetMapping("/sample/file/form")
-	public ModelAndView sampleFileForm() {
-		ModelAndView mav = new ModelAndView();
-
-		mav.setViewName("system/SampleFileForm");
-
-		return mav;
-	}
-
-	/**
-	 * 샘플파일 목록
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@GetMapping("/sample/file/list")
-	@ResponseBody
-	public Collection<SampleFile> getSampleFileList() {
-		return systemService.getSampleFileList();
-	}
-
-	/**
-	 * 샘플파일 등록/수정 처리
-	 * @param sampleFile - 샘플파일 정보
-	 * @return
-	 * @author gagamel
-	 * @since 2020. 11. 3
-	 */
-	@PostMapping("/sample/file/save")
-	@ResponseBody
-	public GagaResponse saveSampleFile(@RequestBody SampleFile sampleFile) {
-		sampleFile.setRegNo(TsaSession.getInfo().getUserNo());
-		sampleFile.setUpdNo(TsaSession.getInfo().getUserNo());
-		systemService.saveSampleFile(sampleFile);
-		return super.ok(message.getMessage("SUCC_0001"));
-	}
-
-}
+package com.style24.admin.biz.web;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.style24.admin.biz.service.TsaRendererService;
+import com.style24.admin.biz.service.TsaSystemService;
+import com.style24.admin.support.controller.TsaBaseController;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.Menu;
+import com.style24.persistence.domain.SampleFile;
+import com.style24.persistence.domain.User;
+import com.style24.persistence.domain.UserMenu;
+
+import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.core.security.GagaPasswordEncoder;
+import com.gagaframework.web.rest.server.GagaResponse;
+
+/**
+ * 운영관리 Controller
+ *
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@Controller
+@RequestMapping("/system")
+@Slf4j
+public class TsaSystemController extends TsaBaseController {
+
+	@Autowired
+	private TscMessageByLocale message;
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private TsaSystemService systemService;
+
+	@Autowired
+	private TsaRendererService rendererService;
+
+	@Autowired
+	private GagaPasswordEncoder passwordEncoder;
+
+	@Value("${upload.default.target.path}")
+	private String uploadTargetPath;
+
+	/**
+	 * 사용자관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@GetMapping("/user/form")
+	public ModelAndView userForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 공급업체 콤보박스 목록
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// 권한 콤보박스 목록
+		mav.addObject("roleList", rendererService.getCommonCodeList("G001"));
+
+		mav.setViewName("system/UserForm");
+
+		return mav;
+	}
+
+	/**
+	 * 사용자 목록
+	 * @param user - 사용자 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@PostMapping("/user/list")
+	@ResponseBody
+	public Collection<User> getUserList(@RequestBody User user) {
+		return systemService.getUserList(user);
+	}
+
+	/**
+	 * 사용자 목록 삭제 처리
+	 * @param userList - 사용자 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@PostMapping("/user/list/delete")
+	@ResponseBody
+	public GagaResponse deleteUserList(@RequestBody Collection<User> userList) {
+		if (userList == null || userList.isEmpty())
+			throw new IllegalStateException(message.getMessage("FAIL_1001"));
+
+		systemService.deleteUserList(userList);
+
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	/**
+	 * 사용자 정보 조회
+	 * @param mode   - 모드(N:신규, U:상세/수정, C:복사)
+	 * @param userNo - 사용자번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@GetMapping("/user/info/form")
+	public ModelAndView getUser(@RequestParam(value = "mode") String mode,
+		@RequestParam(value = "userNo", required = false) Integer userNo) {
+		ModelAndView mav = new ModelAndView();
+
+		// 권한 콤보박스 목록
+		if (!TsaSession.getInfo().getRoleCd().equals("0000")) {
+			mav.addObject("roleList", rendererService.getCommonCodeList("G001", "Y", new String[] {"0000"}));
+		} else {
+			mav.addObject("roleList", rendererService.getAvailCommonCodeList("G001"));
+		}
+
+		// 공급업체 콤보박스 목록
+		mav.addObject("supplyCompList", rendererService.getSupplyCompanyList(TsaSession.getInfo().getSupplyCompCd()));
+
+		// 외부몰벤더 콤보박스 목록
+		mav.addObject("vendorList", rendererService.getCommonCodeList("G003", "Y", TsaSession.getInfo().getSupplyCompCd()));
+
+		if (mode.equals("U")) {
+			// 어드민사용자정보
+			mav.addObject("userInfo", systemService.getUser(userNo));
+		} else {
+			mav.addObject("userInfo", new User());
+		}
+
+		mav.addObject("mode", mode);
+
+		mav.setViewName("system/UserDetailForm");
+
+		return mav;
+	}
+
+	/**
+	 * 사용자ID 조회
+	 * @param userId - 사용자ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@GetMapping("/user/id/{userId}")
+	@ResponseBody
+	public int getUserIdCount(@PathVariable("userId") String userId) {
+		return systemService.getUserIdCount(userId);
+	}
+
+	/**
+	 * 사용자 저장 처리
+	 * @param user - 사용자 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@PostMapping("/user/save")
+	@ResponseBody
+	public GagaResponse saveUser(@RequestBody User user) {
+		if (user.getMode().equals("N")) { // 신규등록
+			user.setPasswd(passwordEncoder.encode(user.getPasswd()));
+		}
+
+		systemService.saveUser(user);
+
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 사용자 비밀번호 변경
+	 * @param user - 사용자 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@PostMapping("/user/password/change")
+	@ResponseBody
+	public GagaResponse changePassword(@RequestBody User user) {
+		user.setPasswd(passwordEncoder.encode(user.getPasswd()));
+		user.setUpdNo(TsaSession.getInfo().getUserNo());
+		log.info("user: {}", user);
+
+		// 어드민사용자 비밀번호 수정
+		systemService.updateUserPassword(user);
+
+		return super.ok(message.getMessage("SUCC_0009"));
+	}
+
+	/**
+	 * 사용자 메뉴 관리 화면
+	 * @param userNo - 사용자번호
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@GetMapping("/user/menu/{userNo}")
+	public ModelAndView getAdminUserMenu(@PathVariable("userNo") Integer userNo) {
+		ModelAndView mav = new ModelAndView();
+
+		// 사용자 메뉴 목록
+		mav.addObject("userMenuList", systemService.getUserMenuList(userNo));
+
+		mav.setViewName("system/UserMenuForm");
+
+		return mav;
+	}
+
+	/**
+	 * 사용자 메뉴 목록 저장 처리
+	 * @param menuList - 사용자 메뉴 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@PostMapping("/user/menu/list/save")
+	@ResponseBody
+	public GagaResponse saveUserMenuList(@RequestBody Collection<UserMenu> menuList) {
+		systemService.saveUserMenuList(menuList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 비밀번호 변경 팝업
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 30
+	 */
+	@GetMapping("/password/change/form")
+	public ModelAndView passwordChangeForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("system/PasswordChangeForm");
+
+		return mav;
+	}
+
+	/**
+	 * 메뉴관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@GetMapping("/menu/form")
+	public ModelAndView menuListForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 최상위메뉴 콤보박스 목록
+		mav.addObject("topMenuList", rendererService.getTopMenuList(""));
+
+		// 전체메뉴 콤보박스 목록
+		mav.addObject("allMenuList", rendererService.getAllMenuList());
+
+		// 권한 콤보박스 목록
+		mav.addObject("roleList", rendererService.getCommonCodeList("G001"));
+
+		mav.setViewName("system/MenuForm");
+
+		return mav;
+	}
+
+	/**
+	 * 메뉴 목록
+	 * @param pmenuId - 상위메뉴ID
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@GetMapping("/menu/list")
+	@ResponseBody
+	public Collection<Menu> getMenuList(@RequestParam(value = "pmenuId", required = false) String pmenuId) {
+		return systemService.getMenuList(pmenuId);
+	}
+
+	/**
+	 * 메뉴 사용안함 처리
+	 * @param menuList - 메뉴 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@PostMapping("/menu/list/save")
+	@ResponseBody
+	public GagaResponse saveMenuList(@RequestBody Collection<Menu> menuList) {
+		systemService.saveMenuList(menuList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 메뉴 등록/수정 처리
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@PostMapping("/menu/save")
+	@ResponseBody
+	public GagaResponse saveMenu(@RequestBody Menu menu) {
+		systemService.saveMenu(menu);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 공통코드관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@GetMapping("/commoncode/form")
+	public ModelAndView commoncodeListForm() {
+		ModelAndView mav = new ModelAndView();
+
+//		// 코드구분 콤보박스 목록
+//		mav.addObject("cdGbList", rendererService.getCommonCodeList("ROOT"));
+
+		mav.setViewName("system/CommoncodeForm");
+
+		return mav;
+	}
+
+	/**
+	 * 공통코드 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@GetMapping("/commoncode/list")
+	@ResponseBody
+	public Collection<CommonCode> getCommonCodeList(@RequestParam(value = "cdGb", required = false) String cdGb) {
+		CommonCode commoncode = new CommonCode();
+		commoncode.setCdGb(cdGb);
+		return systemService.getCommonCodeList(commoncode);
+	}
+
+	/**
+	 * 공통코드 목록 저장 처리
+	 * @param commonCodeList - 공통코드 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@PostMapping("/commoncode/list/save")
+	@ResponseBody
+	public GagaResponse saveCommonCodeList(@RequestBody Collection<CommonCode> commonCodeList) {
+		systemService.saveCommonCodeList(commonCodeList);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 공통코드 저장 처리
+	 * @param commonCode - 공통코드 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 10. 7
+	 */
+	@PostMapping("/commoncode/save")
+	@ResponseBody
+	public GagaResponse saveCommonCode(@RequestBody CommonCode commonCode) {
+		systemService.saveCommonCode(commonCode);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 샘플양식관리 화면
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@GetMapping("/sample/file/form")
+	public ModelAndView sampleFileForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("system/SampleFileForm");
+
+		return mav;
+	}
+
+	/**
+	 * 샘플파일 목록
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@GetMapping("/sample/file/list")
+	@ResponseBody
+	public Collection<SampleFile> getSampleFileList() {
+		return systemService.getSampleFileList();
+	}
+
+	/**
+	 * 샘플파일 등록/수정 처리
+	 * @param sampleFile - 샘플파일 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2020. 11. 3
+	 */
+	@PostMapping("/sample/file/save")
+	@ResponseBody
+	public GagaResponse saveSampleFile(@RequestBody SampleFile sampleFile) {
+		sampleFile.setRegNo(TsaSession.getInfo().getUserNo());
+		sampleFile.setUpdNo(TsaSession.getInfo().getUserNo());
+		systemService.saveSampleFile(sampleFile);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+}

+ 23 - 23
style24.admin/src/main/java/com/style24/persistence/domain/Aflink.java

@@ -1,23 +1,23 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 제휴채널 Domain
- *
- * @author gagamel
- * @since 2020. 10. 20
- */
-@SuppressWarnings("serial")
-@Data
-public class Aflink extends TscBaseDomain {
-
-	private String afLinkCd;	// 제휴링크코드
-	private String afLinkNm;	// 제휴링크명
-	private String afChannel;	// 제휴채널
-	private int dispOrd;		// 표시순서
-	private String useYn;		// 사용여부
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 제휴채널 Domain
+ *
+ * @author gagamel
+ * @since 2020. 10. 20
+ */
+@SuppressWarnings("serial")
+@Data
+public class Aflink extends TscBaseDomain {
+
+	private String afLinkCd;	// 제휴링크코드
+	private String afLinkNm;	// 제휴링크명
+	private String afChannel;	// 제휴채널
+	private int dispOrd;		// 표시순서
+	private String useYn;		// 사용여부
+
+}

+ 42 - 42
style24.admin/src/main/java/com/style24/persistence/domain/Brand.java

@@ -1,42 +1,42 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 브랜드 Domain
- *
- * @author gagamel
- * @since 2020. 10. 7
- */
-@SuppressWarnings("serial")
-@Data
-public class Brand extends TscBaseDomain {
-
-	private String brandGb;			// 브랜드구분
-	private String brandCd;			// 브랜드코드
-	private String brandEnm;		// 브랜드영문명
-	private String brandKnm;		// 브랜드한글명
-	private String brandGrpNm;		// 브랜드그룹명
-	private String supplyCompCd;	// 공급업체코드
-	private String supplyCompNm;	// 공급업체명
-	private String delvLocCd;		// 출고처코드(출고처)
-	private String delvLocNm;		// 출고처명
-	private String erpBrandCd;		// ERP브랜드코드
-	private String selfYn;			// 자사여부(Y:자사, N:입점)
-	private int delvFee;			// 기본배송비
-	private int minOrdAmt;			// 무료배송비최소주문금액
-	private float sellFeeRate;		// 판매수수료율
-	private float pntPrate10;		// 포인트적립율(PC정상)
-	private float pntMrate10;		// 포인트적립율(모바일정상)
-	private float pntPrate20;		// 포인트적립율(PC이월)
-	private float pntMrate20;		// 포인트적립율(모바일이월)
-	private String distributionGb;	// 유통구분(공통코드 G065)
-	private int dispOrd;			// 표시순서
-	private String useYn;			// 사용여부(Y:사용)
-
-	// 검색조건
-	private String searchTxt;		// 검색어
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 브랜드 Domain
+ *
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class Brand extends TscBaseDomain {
+
+	private String brandGb;			// 브랜드구분
+	private String brandCd;			// 브랜드코드
+	private String brandEnm;		// 브랜드영문명
+	private String brandKnm;		// 브랜드한글명
+	private String brandGrpNm;		// 브랜드그룹명
+	private String supplyCompCd;	// 공급업체코드
+	private String supplyCompNm;	// 공급업체명
+	private String delvLocCd;		// 출고처코드(출고처)
+	private String delvLocNm;		// 출고처명
+	private String erpBrandCd;		// ERP브랜드코드
+	private String selfYn;			// 자사여부(Y:자사, N:입점)
+	private int delvFee;			// 기본배송비
+	private int minOrdAmt;			// 무료배송비최소주문금액
+	private float sellFeeRate;		// 판매수수료율
+	private float pntPrate10;		// 포인트적립율(PC정상)
+	private float pntMrate10;		// 포인트적립율(모바일정상)
+	private float pntPrate20;		// 포인트적립율(PC이월)
+	private float pntMrate20;		// 포인트적립율(모바일이월)
+	private String distributionGb;	// 유통구분(공통코드 G065)
+	private int dispOrd;			// 표시순서
+	private String useYn;			// 사용여부(Y:사용)
+
+	// 검색조건
+	private String searchTxt;		// 검색어
+
+}

+ 25 - 25
style24.admin/src/main/java/com/style24/persistence/domain/BrandMd.java

@@ -1,25 +1,25 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 브랜드담당MD Domain
- *
- * @author gagamel
- * @since 2020. 11. 4
- */
-@SuppressWarnings("serial")
-@Data
-public class BrandMd extends TscBaseDomain {
-
-	private String brandCd;		// 브랜드코드
-	private String formalGb;	// 정상이월구분
-	private String mdNo;		// MD번호
-
-	// 담당MD 화면에서 사용
-	private String mdNm;		// MD명
-	private String callbackFn;	// 콜백함수
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 브랜드담당MD Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 4
+ */
+@SuppressWarnings("serial")
+@Data
+public class BrandMd extends TscBaseDomain {
+
+	private String brandCd;		// 브랜드코드
+	private String formalGb;	// 정상이월구분
+	private String mdNo;		// MD번호
+
+	// 담당MD 화면에서 사용
+	private String mdNm;		// MD명
+	private String callbackFn;	// 콜백함수
+
+}

+ 25 - 25
style24.admin/src/main/java/com/style24/persistence/domain/Color.java

@@ -1,25 +1,25 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 색상 Domain
- *
- * @author gagamel
- * @since 2020. 10. 7
- */
-@SuppressWarnings("serial")
-@Data
-public class Color extends TscBaseDomain {
-
-	private String colorCd;			// 색상코드
-	private String colorEnm;		// 색상영문명
-	private String colorKnm;		// 색상한글명
-	private String colorFile;		// 색상파일
-	private String colorGrpNm;		// 색상그룹명
-	private String colorGrpCd;		// 색상그룹코드
-	private String useYn;			// 사용여부
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 색상 Domain
+ *
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class Color extends TscBaseDomain {
+
+	private String colorCd;			// 색상코드
+	private String colorEnm;		// 색상영문명
+	private String colorKnm;		// 색상한글명
+	private String colorFile;		// 색상파일
+	private String colorGrpNm;		// 색상그룹명
+	private String colorGrpCd;		// 색상그룹코드
+	private String useYn;			// 사용여부
+
+}

+ 28 - 28
style24.admin/src/main/java/com/style24/persistence/domain/Extmall.java

@@ -1,28 +1,28 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 외부몰 Domain
- *
- * @author gagamel
- * @since 2020. 11. 5
- */
-@SuppressWarnings("serial")
-@Data
-public class Extmall extends TscBaseDomain {
-
-	private String vendorId;		// 벤더ID
-	private String extmallId;		// 제휴몰ID
-	private String extmallUserId;	// 제휴몰사용자ID
-	private String extmallNm;		// 제휴몰명
-	private String supplyCompCd;	// 공급업체코드
-	private String sellStoreCd;		// 판매매장코드
-	private float stockSellRate;	// 재고판매비율
-	private float priceAcceptRate;	// 가격허용율
-	private String dwdpYn;			// 직접회수여부(Y:제휴몰에서회수, N:자사몰에서회수)
-	private String useYn;			// 사용여부
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 외부몰 Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 5
+ */
+@SuppressWarnings("serial")
+@Data
+public class Extmall extends TscBaseDomain {
+
+	private String vendorId;		// 벤더ID
+	private String extmallId;		// 제휴몰ID
+	private String extmallUserId;	// 제휴몰사용자ID
+	private String extmallNm;		// 제휴몰명
+	private String supplyCompCd;	// 공급업체코드
+	private String sellStoreCd;		// 판매매장코드
+	private float stockSellRate;	// 재고판매비율
+	private float priceAcceptRate;	// 가격허용율
+	private String dwdpYn;			// 직접회수여부(Y:제휴몰에서회수, N:자사몰에서회수)
+	private String useYn;			// 사용여부
+
+}

+ 27 - 27
style24.admin/src/main/java/com/style24/persistence/domain/ExtmallNoti.java

@@ -1,27 +1,27 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 외부몰고시정보 Domain
- *
- * @author gagamel
- * @since 2020. 11. 6
- */
-@SuppressWarnings("serial")
-@Data
-public class ExtmallNoti extends TscBaseDomain {
-
-	private String vendorId;
-	private String extmallNiClsfCd;
-	private String extmallNiClsfNm;
-	private String extmallNiItemCd;
-	private String extmallNiItemNm;
-	private String selfmallNiClsfNm;
-	private String selfmallNiItemNm;
-
-	private String niContent;
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 외부몰고시정보 Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 6
+ */
+@SuppressWarnings("serial")
+@Data
+public class ExtmallNoti extends TscBaseDomain {
+
+	private String vendorId;
+	private String extmallNiClsfCd;
+	private String extmallNiClsfNm;
+	private String extmallNiItemCd;
+	private String extmallNiItemNm;
+	private String selfmallNiClsfNm;
+	private String selfmallNiItemNm;
+
+	private String niContent;
+
+}

+ 23 - 23
style24.admin/src/main/java/com/style24/persistence/domain/ExtmallPriceSync.java

@@ -1,23 +1,23 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 외부몰가격연계 Domain
- *
- * @author gagamel
- * @since 2020. 11. 7
- */
-@SuppressWarnings("serial")
-@Data
-public class ExtmallPriceSync extends TscBaseDomain {
-
-	private String vendorId;	// 벤더ID
-	private String brandCd;		// 브랜드코드
-	private String brandKnm;	// 브랜드국문명
-	private String brandEnm;	// 브랜드영문명
-	private String syncYn;		// 연계여부
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 외부몰가격연계 Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class ExtmallPriceSync extends TscBaseDomain {
+
+	private String vendorId;	// 벤더ID
+	private String brandCd;		// 브랜드코드
+	private String brandKnm;	// 브랜드국문명
+	private String brandEnm;	// 브랜드영문명
+	private String syncYn;		// 연계여부
+
+}

+ 29 - 29
style24.admin/src/main/java/com/style24/persistence/domain/Faq.java

@@ -1,29 +1,29 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * FAQ Domain
- *
- * @author gagamel
- * @since 2020. 11. 3
- */
-@SuppressWarnings("serial")
-@Data
-public class Faq extends TscBaseDomain {
-
-	private Integer faqSq;		// FAQ일련번호
-	private String siteCd;		// 사이트코드
-	private String siteNm;		// 사이트명
-	private String faqType;		// FAQ유형
-	private String question;	// 질문
-	private String answer;		// 답변
-	private String useYn;		// 사용여부
-	private int readCnt;		// 조회수
-
-	// 검색조건
-	private String searchTxt;	//검색어
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * FAQ Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 3
+ */
+@SuppressWarnings("serial")
+@Data
+public class Faq extends TscBaseDomain {
+
+	private Integer faqSq;		// FAQ일련번호
+	private String siteCd;		// 사이트코드
+	private String siteNm;		// 사이트명
+	private String faqType;		// FAQ유형
+	private String question;	// 질문
+	private String answer;		// 답변
+	private String useYn;		// 사용여부
+	private int readCnt;		// 조회수
+
+	// 검색조건
+	private String searchTxt;	//검색어
+
+}

+ 167 - 167
style24.admin/src/main/java/com/style24/persistence/domain/Goods.java

@@ -1,167 +1,167 @@
-package com.style24.persistence.domain;
-
-import java.util.Collection;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TsaPageRequest;
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 상품 Domain
- *
- * @author eskim
- * @since 2020. 10. 20
- */
-@SuppressWarnings("serial")
-@Data
-public class Goods extends TscBaseDomain {
-
-	private String goodsCd;		//상품코드
-	private String brandCd;		//브랜드코드
-	private String itemkindCd;		//품목코드
-	private String goodsNm;		//상품명
-	private String goodsTnm;		//상품타이틀명
-	private String goodsSnm;		//상품검색명
-	private String goodsSnm1;		//상품검색명1(사용자등록용)
-	private String colorCd;		//색상코드
-	private String mainColorYn;		//대표색상여부
-	private String styleYear;		//스타일연도
-	private String seasonCd;		//시즌코드(공통코드G006)
-	private String sexGb;		//성별구분(공통코드G007)
-	private String goodsNum;		//품번(자사상품만 사용)
-	private String goodsType;		//상품타입(공통코드G056)
-	private int listPrice;		//정상가(최초판매가)
-	private int currPrice;		//현재판매가
-	private int currBprice;		//변경전현재판매가
-	private String priceUpdDt;		//가격변경일시
-	private float dcRate;		//할인율
-
-	private String goodsStat;		//상품상태(공통코드G008)
-	private String selfMallYn;		//자사몰노출여부
-	private String goodsGb;		//해외구매대행/병행수입 상품일 경우 주문 시 통관부호 입력 란이 추가되어야 한다
-	private String distributionGb;		//유통구분(공콩코드 G065)
-	private String selfGoodsYn;		//자사상품여부
-	private String supplyCompCd;		//공급업체코드
-	private String supplyGoodsCd;		//공급업체상품코드(원코드)
-	private String ageGrpCd;		//상품연령대(공통코드 G023)
-	private int delvFee;		//배송비
-	private int minOrdAmt;		//무료배송비최소구매금액
-	private float pntPrate;		//포인트적립율(PC)
-	private float pntMrate;		//포인트적립율(모바일)
-	private float sellFeeRate;		//판매수수료율
-	private String formalGb;		//정상이월구분(공통코드G009)
-	private String changeableYn;		//교환가능여부
-	private String returnableYn;		//반품가능여부
-	private String changeFeeFreeYn;		//교환배송비무료여부
-	private String returnFeeFreeYn;		//반품배송비무료여부
-	private String prePpntUsableYn;		//선포인트사용가능여부(PC)
-	private String preMpntUsableYn;		//선포인트사용가능여부(모바일)
-	private int minOrdQty;		//최소주문수량
-	private int maxOrdQty;		//최대주문수량
-	private int dayMaxOrdQty;		//ID당1일최대구매수량
-	private String frstCfrmDt;		//최초승인일시
-	private String makeNm;		//제조국(원산지)
-	private String makeYmd;		//제조연월일
-	private String taxGb;		//과세구분(10:과세, 20:비과세)
-	private String erpPriceLinkYn;		//ERP가격연계여부(자사상품만 사용. Y:연계)
-	private String erpStockLinkYn;		//ERP재고연계여부(자사상품만 사용. Y:연계)
-
-	private String brandEnm;		//브랜드영문명
-	private String brandGrpNm;		//브랜드그룹명
-
-	private String goodsDesc;
-	private String goodsPcTopDesc;
-	private String goodsPcDownDesc;
-	private String goodsMobileTopDesc;
-	private String goodsMobileDownDesc;
-	private String chkDescKeep = "N";
-//
-	private String chDataYn = "N";
-	private String chImgYn = "N";
-	private String chNotiYn = "N";
-	private String chStockDataYn = "N";
-	private String chGoodsStatYn = "N";
-	private int stockQtySum;
-	private String goodsImageYn;
-	private String itemkindNm;
-	private String niClsfCd;
-
-	private int currPriceOrg;
-	private String goodsStatOrg;
-	private String formalGbOrg;
-
-	private String imgType;
-	private String imgPath1;
-	private String imgPath6;
-	private String niClsfNm;
-	private String goodsTypeNm;
-	private String goodTnmInit;
-//
-//	private String goodsRegMsg;
-	private String procJob;
-	private String excelFileNm;
-//	private String searchGb;
-
-	private String blankFlag;
-//
-//	private Integer sizeCurrStockQty;
-//	private Integer sizeBaseStockQty;
-//	private Integer sizeSaleStockQty;
-//	private Integer sizeStockQty;
-//	private String goodsSizeCd;
-//	private String sizeSoldoutYn;
-	private String siteCd;
-	private int sellDay15Qty;
-
-	private int goodsSq;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] arrGoodsCd;
-
-	// 상품옵션/재고
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] compsGoodsCd; // 상품 사이즈
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] optCd; // 상품 사이즈
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] optNm1; // 상품 옵션1
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] optNm2; // 상품 옵션2
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] baseStockQty; // 안전재고
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] currStockQty; // erp가용재고
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] editCurrStockQty; // 수정가용재고
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] soldoutYn; // 품절여부
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] dispOrd; // 우선순위
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] dispYn; // 전시여부
-
-	private Collection<GoodsNotiInfo> notiListNew; // 고시항목
-
-	private String notiList; // 고시항목
-//	private String delvLocCd;
-
-	private Collection<GoodsCompose> goodsComposeListNew; // 상품 구성상품
-	private String goodsComposeList; // 상품 구성상품
-
-	// Pagination
-	private TsaPageRequest pageable;
-	private int pageNo = 1;
-	private int pageSize = 50;
-	private int pageUnit = 10;
-}
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 Domain
+ *
+ * @author eskim
+ * @since 2020. 10. 20
+ */
+@SuppressWarnings("serial")
+@Data
+public class Goods extends TscBaseDomain {
+
+	private String goodsCd;		//상품코드
+	private String brandCd;		//브랜드코드
+	private String itemkindCd;		//품목코드
+	private String goodsNm;		//상품명
+	private String goodsTnm;		//상품타이틀명
+	private String goodsSnm;		//상품검색명
+	private String goodsSnm1;		//상품검색명1(사용자등록용)
+	private String colorCd;		//색상코드
+	private String mainColorYn;		//대표색상여부
+	private String styleYear;		//스타일연도
+	private String seasonCd;		//시즌코드(공통코드G006)
+	private String sexGb;		//성별구분(공통코드G007)
+	private String goodsNum;		//품번(자사상품만 사용)
+	private String goodsType;		//상품타입(공통코드G056)
+	private int listPrice;		//정상가(최초판매가)
+	private int currPrice;		//현재판매가
+	private int currBprice;		//변경전현재판매가
+	private String priceUpdDt;		//가격변경일시
+	private float dcRate;		//할인율
+
+	private String goodsStat;		//상품상태(공통코드G008)
+	private String selfMallYn;		//자사몰노출여부
+	private String goodsGb;		//해외구매대행/병행수입 상품일 경우 주문 시 통관부호 입력 란이 추가되어야 한다
+	private String distributionGb;		//유통구분(공콩코드 G065)
+	private String selfGoodsYn;		//자사상품여부
+	private String supplyCompCd;		//공급업체코드
+	private String supplyGoodsCd;		//공급업체상품코드(원코드)
+	private String ageGrpCd;		//상품연령대(공통코드 G023)
+	private int delvFee;		//배송비
+	private int minOrdAmt;		//무료배송비최소구매금액
+	private float pntPrate;		//포인트적립율(PC)
+	private float pntMrate;		//포인트적립율(모바일)
+	private float sellFeeRate;		//판매수수료율
+	private String formalGb;		//정상이월구분(공통코드G009)
+	private String changeableYn;		//교환가능여부
+	private String returnableYn;		//반품가능여부
+	private String changeFeeFreeYn;		//교환배송비무료여부
+	private String returnFeeFreeYn;		//반품배송비무료여부
+	private String prePpntUsableYn;		//선포인트사용가능여부(PC)
+	private String preMpntUsableYn;		//선포인트사용가능여부(모바일)
+	private int minOrdQty;		//최소주문수량
+	private int maxOrdQty;		//최대주문수량
+	private int dayMaxOrdQty;		//ID당1일최대구매수량
+	private String frstCfrmDt;		//최초승인일시
+	private String makeNm;		//제조국(원산지)
+	private String makeYmd;		//제조연월일
+	private String taxGb;		//과세구분(10:과세, 20:비과세)
+	private String erpPriceLinkYn;		//ERP가격연계여부(자사상품만 사용. Y:연계)
+	private String erpStockLinkYn;		//ERP재고연계여부(자사상품만 사용. Y:연계)
+
+	private String brandEnm;		//브랜드영문명
+	private String brandGrpNm;		//브랜드그룹명
+
+	private String goodsDesc;
+	private String goodsPcTopDesc;
+	private String goodsPcDownDesc;
+	private String goodsMobileTopDesc;
+	private String goodsMobileDownDesc;
+	private String chkDescKeep = "N";
+//
+	private String chDataYn = "N";
+	private String chImgYn = "N";
+	private String chNotiYn = "N";
+	private String chStockDataYn = "N";
+	private String chGoodsStatYn = "N";
+	private int stockQtySum;
+	private String goodsImageYn;
+	private String itemkindNm;
+	private String niClsfCd;
+
+	private int currPriceOrg;
+	private String goodsStatOrg;
+	private String formalGbOrg;
+
+	private String imgType;
+	private String imgPath1;
+	private String imgPath6;
+	private String niClsfNm;
+	private String goodsTypeNm;
+	private String goodTnmInit;
+//
+//	private String goodsRegMsg;
+	private String procJob;
+	private String excelFileNm;
+//	private String searchGb;
+
+	private String blankFlag;
+//
+//	private Integer sizeCurrStockQty;
+//	private Integer sizeBaseStockQty;
+//	private Integer sizeSaleStockQty;
+//	private Integer sizeStockQty;
+//	private String goodsSizeCd;
+//	private String sizeSoldoutYn;
+	private String siteCd;
+	private int sellDay15Qty;
+
+	private int goodsSq;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrGoodsCd;
+
+	// 상품옵션/재고
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] compsGoodsCd; // 상품 사이즈
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optCd; // 상품 사이즈
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optNm1; // 상품 옵션1
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] optNm2; // 상품 옵션2
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] baseStockQty; // 안전재고
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] currStockQty; // erp가용재고
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] editCurrStockQty; // 수정가용재고
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] soldoutYn; // 품절여부
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] dispOrd; // 우선순위
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] dispYn; // 전시여부
+
+	private Collection<GoodsNotiInfo> notiListNew; // 고시항목
+
+	private String notiList; // 고시항목
+//	private String delvLocCd;
+
+	private Collection<GoodsCompose> goodsComposeListNew; // 상품 구성상품
+	private String goodsComposeList; // 상품 구성상품
+
+	// Pagination
+	private TsaPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+}

+ 93 - 93
style24.admin/src/main/java/com/style24/persistence/domain/GoodsCategory.java

@@ -1,93 +1,93 @@
-package com.style24.persistence.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 상품별 카테고리 Domain
- * @author eskim
- * @since 2020. 10. 30
- */
-@SuppressWarnings("serial")
-@Data
-public class GoodsCategory extends TscBaseDomain {
-
-	private int startRow;
-	private int endRow;
-	private String fullCateNm;
-	private String imgPath1;
-	private String imgPath4;
-	private String imgPath6;
-	private String imgType;
-	private String goodsCd;
-	private String goodsNm;
-	private int currStockQty;
-	private int baseStockQty;
-	private int dcRate;
-	private String dcRateSt;
-	private String dcRateEd;
-	private int listPrice;
-	private int currPrice;
-	private String currPriceSt;
-	private String currPriceEd;
-	private int pntPrate;
-	private String prePpntUsableYn;
-	private int pntMrate;
-	private String preMpntUsableYn;
-	private String soldoutYn;
-	private String erpStockLinkYn;
-	private String formalGb;
-	private String selfGoodsYn;
-	private String mdId;
-	private String supplyGoodsCd;
-	private String supplyCompCd;
-	private String brandEnm;
-	private String brandGrpNm;
-	private String brandCd;
-	private String itemkindCd;
-	private String colorEnm;
-	private String goodsStat;
-	private String siteCd;
-	private String styleYear;
-	private String seasonCd;
-	private String changeableYn;
-	private String returnableYn;
-	private String returnFeeFreeYn;
-	private String changeFeeFreeYn;
-	private String stDate;
-	private String edDate;
-	private String dispYn;
-	private String searchGb;
-	private String cateCd;
-	private String cateGb;
-	private String cateType;
-	private String cateCd1;
-	private String cateCd2;
-	private String cateCd3;
-	private String cateCd4;
-	private String cateCd5;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] cateCdArr;
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] cateCd1Arr;
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] cateCd2Arr;
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] cateCd3Arr;
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] cateCd4Arr;
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] cateCd5Arr;
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] cateGbArr;
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] cateTypeArr;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] goodsCdList;
-
-	private String goodsCds;
-}
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품별 카테고리 Domain
+ * @author eskim
+ * @since 2020. 10. 30
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsCategory extends TscBaseDomain {
+
+	private int startRow;
+	private int endRow;
+	private String fullCateNm;
+	private String imgPath1;
+	private String imgPath4;
+	private String imgPath6;
+	private String imgType;
+	private String goodsCd;
+	private String goodsNm;
+	private int currStockQty;
+	private int baseStockQty;
+	private int dcRate;
+	private String dcRateSt;
+	private String dcRateEd;
+	private int listPrice;
+	private int currPrice;
+	private String currPriceSt;
+	private String currPriceEd;
+	private int pntPrate;
+	private String prePpntUsableYn;
+	private int pntMrate;
+	private String preMpntUsableYn;
+	private String soldoutYn;
+	private String erpStockLinkYn;
+	private String formalGb;
+	private String selfGoodsYn;
+	private String mdId;
+	private String supplyGoodsCd;
+	private String supplyCompCd;
+	private String brandEnm;
+	private String brandGrpNm;
+	private String brandCd;
+	private String itemkindCd;
+	private String colorEnm;
+	private String goodsStat;
+	private String siteCd;
+	private String styleYear;
+	private String seasonCd;
+	private String changeableYn;
+	private String returnableYn;
+	private String returnFeeFreeYn;
+	private String changeFeeFreeYn;
+	private String stDate;
+	private String edDate;
+	private String dispYn;
+	private String searchGb;
+	private String cateCd;
+	private String cateGb;
+	private String cateType;
+	private String cateCd1;
+	private String cateCd2;
+	private String cateCd3;
+	private String cateCd4;
+	private String cateCd5;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCdArr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd1Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd2Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd3Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd4Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateCd5Arr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateGbArr;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] cateTypeArr;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] goodsCdList;
+
+	private String goodsCds;
+}

+ 20 - 20
style24.admin/src/main/java/com/style24/persistence/domain/GoodsDesc.java

@@ -1,20 +1,20 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 상품 상세 설명 Domain
- * @author eskim
- * @since 2020. 10. 22
- */
-@SuppressWarnings("serial")
-@Data
-public class GoodsDesc extends TscBaseDomain {
-
-	private String goodsCd;
-	private String descGb;
-	private int seq;
-	private String goodsDesc;
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 상세 설명 Domain
+ * @author eskim
+ * @since 2020. 10. 22
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsDesc extends TscBaseDomain {
+
+	private String goodsCd;
+	private String descGb;
+	private int seq;
+	private String goodsDesc;
+}

+ 68 - 68
style24.admin/src/main/java/com/style24/persistence/domain/GoodsHst.java

@@ -1,68 +1,68 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 상품 이력 Domain
- *
- * @author eskim
- * @since 2020. 10. 23
- */
-@SuppressWarnings("serial")
-@Data
-public class GoodsHst extends TscBaseDomain {
-
-	private Integer goodsHstSq;		//상품이력일련번호
-	private String goodsCd;		//상품이력. 상품 수정에 의한 발생
-	private String brandCd;		//브랜드코드
-	private String itemkindCd;		//품목코드
-	private String goodsNm;		//상품명
-	private String goodsTnm;		//상품타이틀명
-	private String goodsSnm;		//상품검색명
-	private String goodsSnm1;		//상품검색명1(사용자등록용)
-	private String colorCd;		//색상코드
-	private String mainColorYn;		//대표색상여부
-	private String styleYear;		//스타일연도
-	private String seasonCd;		//시즌코드(공통코드G006)
-	private String sexGb;		//성별구분(공통코드G007)
-	private String goodsNum;		//품번(자사상품만 사용)
-	private String shapeCd;		//스타일모양코드(없으면 X)
-	private String goodsType;		//상품타입(공통코드G056)
-	private int listPrice;		//정상가(최초판매가)
-	private int currPrice;		//현재판매가
-	private int currBprice;		//변경전현재판매가
-	private String priceUpdDt;		//가격변경일시
-	private float dcRate;		//할인율
-	private String goodsStat;		//상품상태(공통코드G008)
-	private String dispYn;		//노출여부
-	private String goodsGb;		//해외구매대행/병행수입 상품일 경우 주문 시 통관부호 입력 란이 추가되어야 한다
-	private String distributionGb;		//유통구분(공콩코드 G065)
-	private String selfGoodsYn;		//자사상품여부
-	private String supplyCompCd;		//공급업체코드
-	private String supplyGoodsCd;		//공급업체상품코드(원코드)
-	private String ageGrpCd;		//상품연령대(공통코드 G023)
-	private int delvFee;		//배송비
-	private int minOrdAmt;		//무료배송비최소구매금액
-	private float pntPrate;		//포인트적립율(PC)
-	private float pntMrate;		//포인트적립율(모바일)
-	private float sellFeeRate;		//판매수수료율
-	private String formalGb;		//정상이월구분(공통코드G009)
-	private String changeableYn;		//교환가능여부
-	private String returnableYn;		//반품가능여부
-	private String changeFeeFreeYn;		//교환배송비무료여부
-	private String returnFeeFreeYn;		//반품배송비무료여부
-	private String prePpntUsableYn;		//선포인트사용가능여부(PC)
-	private String preMpntUsableYn;		//선포인트사용가능여부(모바일)
-	private int minOrdQty;		//최소주문수량
-	private int maxOrdQty;		//최대주문수량
-	private int dayMaxOrdQty;		//ID당1일최대구매수량
-	private String frstCfrmDt;		//최초승인일시
-	private String makeNm;		//제조국(원산지)
-	private String makeYmd;		//제조연월일
-	private String taxGb;		//과세구분(10:과세, 20:비과세)
-	private String erpPriceLinkYn;		//ERP가격연계여부(자사상품만 사용. Y:연계)
-	private String erpStockLinkYn;		//ERP재고연계여부(자사상품만 사용. Y:연계)
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 이력 Domain
+ *
+ * @author eskim
+ * @since 2020. 10. 23
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsHst extends TscBaseDomain {
+
+	private Integer goodsHstSq;		//상품이력일련번호
+	private String goodsCd;		//상품이력. 상품 수정에 의한 발생
+	private String brandCd;		//브랜드코드
+	private String itemkindCd;		//품목코드
+	private String goodsNm;		//상품명
+	private String goodsTnm;		//상품타이틀명
+	private String goodsSnm;		//상품검색명
+	private String goodsSnm1;		//상품검색명1(사용자등록용)
+	private String colorCd;		//색상코드
+	private String mainColorYn;		//대표색상여부
+	private String styleYear;		//스타일연도
+	private String seasonCd;		//시즌코드(공통코드G006)
+	private String sexGb;		//성별구분(공통코드G007)
+	private String goodsNum;		//품번(자사상품만 사용)
+	private String shapeCd;		//스타일모양코드(없으면 X)
+	private String goodsType;		//상품타입(공통코드G056)
+	private int listPrice;		//정상가(최초판매가)
+	private int currPrice;		//현재판매가
+	private int currBprice;		//변경전현재판매가
+	private String priceUpdDt;		//가격변경일시
+	private float dcRate;		//할인율
+	private String goodsStat;		//상품상태(공통코드G008)
+	private String dispYn;		//노출여부
+	private String goodsGb;		//해외구매대행/병행수입 상품일 경우 주문 시 통관부호 입력 란이 추가되어야 한다
+	private String distributionGb;		//유통구분(공콩코드 G065)
+	private String selfGoodsYn;		//자사상품여부
+	private String supplyCompCd;		//공급업체코드
+	private String supplyGoodsCd;		//공급업체상품코드(원코드)
+	private String ageGrpCd;		//상품연령대(공통코드 G023)
+	private int delvFee;		//배송비
+	private int minOrdAmt;		//무료배송비최소구매금액
+	private float pntPrate;		//포인트적립율(PC)
+	private float pntMrate;		//포인트적립율(모바일)
+	private float sellFeeRate;		//판매수수료율
+	private String formalGb;		//정상이월구분(공통코드G009)
+	private String changeableYn;		//교환가능여부
+	private String returnableYn;		//반품가능여부
+	private String changeFeeFreeYn;		//교환배송비무료여부
+	private String returnFeeFreeYn;		//반품배송비무료여부
+	private String prePpntUsableYn;		//선포인트사용가능여부(PC)
+	private String preMpntUsableYn;		//선포인트사용가능여부(모바일)
+	private int minOrdQty;		//최소주문수량
+	private int maxOrdQty;		//최대주문수량
+	private int dayMaxOrdQty;		//ID당1일최대구매수량
+	private String frstCfrmDt;		//최초승인일시
+	private String makeNm;		//제조국(원산지)
+	private String makeYmd;		//제조연월일
+	private String taxGb;		//과세구분(10:과세, 20:비과세)
+	private String erpPriceLinkYn;		//ERP가격연계여부(자사상품만 사용. Y:연계)
+	private String erpStockLinkYn;		//ERP재고연계여부(자사상품만 사용. Y:연계)
+
+}

+ 42 - 42
style24.admin/src/main/java/com/style24/persistence/domain/GoodsImg.java

@@ -1,42 +1,42 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 상품 이미지 Domain
- * @author eskim
- * @since 2020. 10. 20
- */
-@SuppressWarnings("serial")
-@Data
-public class GoodsImg extends TscBaseDomain {
-
-	private String goodsCd;
-	private String imgType;
-	private String imgPath1;
-	private String imgPath2;
-	private String imgPath3;
-	private String imgPath4;
-	private String imgPath5;
-	private String imgPath6;
-	private String imgPath7;
-	private String imgPath8;
-	private String imgPath9;
-	private String imgPath10;
-	private String imgPath11;
-	private String imgPath12;
-	private String imgPath13;
-	private String imgPath14;
-	private String imgPath15;
-	private String imgPath16;
-	private String imgPath17;
-	private String imgPath18;
-	private String imgPath19;
-	private String imgPath20;
-
-	private String goodsImgPath;
-	private String col;
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 상품 이미지 Domain
+ * @author eskim
+ * @since 2020. 10. 20
+ */
+@SuppressWarnings("serial")
+@Data
+public class GoodsImg extends TscBaseDomain {
+
+	private String goodsCd;
+	private String imgType;
+	private String imgPath1;
+	private String imgPath2;
+	private String imgPath3;
+	private String imgPath4;
+	private String imgPath5;
+	private String imgPath6;
+	private String imgPath7;
+	private String imgPath8;
+	private String imgPath9;
+	private String imgPath10;
+	private String imgPath11;
+	private String imgPath12;
+	private String imgPath13;
+	private String imgPath14;
+	private String imgPath15;
+	private String imgPath16;
+	private String imgPath17;
+	private String imgPath18;
+	private String imgPath19;
+	private String imgPath20;
+
+	private String goodsImgPath;
+	private String col;
+
+}

+ 33 - 33
style24.admin/src/main/java/com/style24/persistence/domain/NotiInfo.java

@@ -1,33 +1,33 @@
-package com.style24.persistence.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 색상 Domain
- *
- * @author gagamel
- * @since 2020. 10. 7
- */
-@SuppressWarnings("serial")
-@Data
-public class NotiInfo extends TscBaseDomain {
-
-	private String supplyCompCd;
-	private String niClsfCd;
-	private String niClsfNm;
-	private String niItemCd;
-	private String niItemNm;
-	private String niContent;
-	private Integer dispOrd;
-	private String reqYn;
-	private String dispYn;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] arrNiClsfCd;
-
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] arrNiItemCd;
-}
+package com.style24.persistence.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 색상 Domain
+ *
+ * @author gagamel
+ * @since 2020. 10. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class NotiInfo extends TscBaseDomain {
+
+	private String supplyCompCd;
+	private String niClsfCd;
+	private String niClsfNm;
+	private String niItemCd;
+	private String niItemNm;
+	private String niContent;
+	private Integer dispOrd;
+	private String reqYn;
+	private String dispYn;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrNiClsfCd;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrNiItemCd;
+}

+ 23 - 23
style24.admin/src/main/java/com/style24/persistence/domain/SampleFile.java

@@ -1,23 +1,23 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 샘플파일 Domain
- *
- * @author gagamel
- * @since 2020. 11. 3
- */
-@SuppressWarnings("serial")
-@Data
-public class SampleFile extends TscBaseDomain {
-
-	private String sampleFileId;
-	private String sampleFileNm;
-	private String orgFileNm;
-	private String sysFileNm;
-	private String useYn;
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 샘플파일 Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 3
+ */
+@SuppressWarnings("serial")
+@Data
+public class SampleFile extends TscBaseDomain {
+
+	private String sampleFileId;
+	private String sampleFileNm;
+	private String orgFileNm;
+	private String sysFileNm;
+	private String useYn;
+
+}

+ 24 - 24
style24.admin/src/main/java/com/style24/persistence/domain/SearchData.java

@@ -1,24 +1,24 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 엑셀조회를 위한 SEARCH_DATA Domain
- *
- * @author eskim
- * @since 2020. 10. 22
- */
-@SuppressWarnings("serial")
-@Data
-public class SearchData extends TscBaseDomain {
-
-	private String searchCd;
-	private int dispOrd;
-	private String procJob;
-	private String dummy1;
-	private String dummy2;
-	private String dummy3;
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 엑셀조회를 위한 SEARCH_DATA Domain
+ *
+ * @author eskim
+ * @since 2020. 10. 22
+ */
+@SuppressWarnings("serial")
+@Data
+public class SearchData extends TscBaseDomain {
+
+	private String searchCd;
+	private int dispOrd;
+	private String procJob;
+	private String dummy1;
+	private String dummy2;
+	private String dummy3;
+
+}

+ 22 - 22
style24.admin/src/main/java/com/style24/persistence/domain/SellStore.java

@@ -1,22 +1,22 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 판매매장 Domain
- *
- * @author gagamel
- * @since 2020. 10. 20
- */
-@SuppressWarnings("serial")
-@Data
-public class SellStore extends TscBaseDomain {
-
-	private String supplyCompCd;	// 공급업체코드
-	private String sellStoreCd;		// 판매매장코드
-	private String sellStoreNm;		// 판매매장명
-	private String useYn;			// 사용여부
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 판매매장 Domain
+ *
+ * @author gagamel
+ * @since 2020. 10. 20
+ */
+@SuppressWarnings("serial")
+@Data
+public class SellStore extends TscBaseDomain {
+
+	private String supplyCompCd;	// 공급업체코드
+	private String sellStoreCd;		// 판매매장코드
+	private String sellStoreNm;		// 판매매장명
+	private String useYn;			// 사용여부
+
+}

+ 22 - 22
style24.admin/src/main/java/com/style24/persistence/domain/ShipCompany.java

@@ -1,22 +1,22 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 배송업체 Domain
- *
- * @author gagamel
- * @since 2020. 10. 20
- */
-@SuppressWarnings("serial")
-@Data
-public class ShipCompany extends TscBaseDomain {
-
-	private String shipCompCd;	// 배송업체코드
-	private String shipCompNm;	// 배송업체명
-	private String trackingUrl;	// 배송추적URL
-	private String useYn;		// 사용여부
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 배송업체 Domain
+ *
+ * @author gagamel
+ * @since 2020. 10. 20
+ */
+@SuppressWarnings("serial")
+@Data
+public class ShipCompany extends TscBaseDomain {
+
+	private String shipCompCd;	// 배송업체코드
+	private String shipCompNm;	// 배송업체명
+	private String trackingUrl;	// 배송추적URL
+	private String useYn;		// 사용여부
+
+}

+ 23 - 23
style24.admin/src/main/java/com/style24/persistence/domain/SiteBrand.java

@@ -1,23 +1,23 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 사이트별브랜드 Domain
- *
- * @author gagamel
- * @since 2020. 11. 4
- */
-@SuppressWarnings("serial")
-@Data
-public class SiteBrand extends TscBaseDomain {
-
-	private String siteCd;		// 사이트코드
-	private String brandCd;		// 브랜드코드
-	private int dispOrd;		// 표시순서
-	private String useYn;		// 사용여부
-	private Integer cate1No;	// 카테고리번호1
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 사이트별브랜드 Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 4
+ */
+@SuppressWarnings("serial")
+@Data
+public class SiteBrand extends TscBaseDomain {
+
+	private String siteCd;		// 사이트코드
+	private String brandCd;		// 브랜드코드
+	private int dispOrd;		// 표시순서
+	private String useYn;		// 사용여부
+	private Integer cate1No;	// 카테고리번호1
+
+}

+ 31 - 31
style24.admin/src/main/java/com/style24/persistence/domain/StockSyncBase.java

@@ -1,31 +1,31 @@
-package com.style24.persistence.domain;
-
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 재고연계기준 Domain
- *
- * @author gagamel
- * @since 2020. 11. 7
- */
-@SuppressWarnings("serial")
-@Data
-public class StockSyncBase extends TscBaseDomain {
-
-	private String delvLocCd;		// 출고처코드
-	private String erpBrandCd;		// ERP브랜드코드
-	private String brandKnm;		// 브랜드국문명
-	private String brandEnm;		// 브랜드영문명
-	private String brandCd;			// 브랜드코드
-	private String formalGb;		// 정상이월구분
-	private String prevStockSyncYn;	// 이전재고연계여부
-	private String stockSyncYn;		// 재고연계여부
-	private String prevDelvSyncYn;	// 이전출고연계여부
-	private String delvSyncYn;		// 출고연계여부
-
-	// 검색조건
-	private String supplyCompCd;	// 공급업체코드
-
-}
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 재고연계기준 Domain
+ *
+ * @author gagamel
+ * @since 2020. 11. 7
+ */
+@SuppressWarnings("serial")
+@Data
+public class StockSyncBase extends TscBaseDomain {
+
+	private String delvLocCd;		// 출고처코드
+	private String erpBrandCd;		// ERP브랜드코드
+	private String brandKnm;		// 브랜드국문명
+	private String brandEnm;		// 브랜드영문명
+	private String brandCd;			// 브랜드코드
+	private String formalGb;		// 정상이월구분
+	private String prevStockSyncYn;	// 이전재고연계여부
+	private String stockSyncYn;		// 재고연계여부
+	private String prevDelvSyncYn;	// 이전출고연계여부
+	private String delvSyncYn;		// 출고연계여부
+
+	// 검색조건
+	private String supplyCompCd;	// 공급업체코드
+
+}

+ 71 - 71
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaAnswerPhase.xml

@@ -1,72 +1,72 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaAnswerPhaseDao">
-
-	<!-- 답변문구 목록 -->
-	<select id="getAnswerPhaseList" parameterType="AnswerPhase" resultType="AnswerPhase">
-		/* TsaAnswerPhase.getAnswerPhaseList */
-		 SELECT SITE_CD                                      /*사이트코드*/
-		      , ANS_SQ                                       /*답변일련번호*/
-		      , ANS_CLSF                                     /*답변종류코드*/
-		      , ANS_TITLE                                    /*답변제목*/
-		      , ANS_CONTENT                                  /*답변내용*/
-		      , USE_YN                                       /*사용여부*/
-		      , FN_GET_USER_NM(REG_NO)             AS REG_NM /*등록자*/
-		      , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT /*등록일자*/
-		      , FN_GET_USER_NM(UPD_NO)             AS UPD_NM /*수정자*/
-		      , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT /*수정일자*/
-		FROM    TB_ANS_PHASE
-		WHERE   1 = 1
-		<if test="siteCd != null and siteCd != ''">
-		AND     SITE_CD = #{siteCd}
-		</if>
-		<if test="ansClsf != null and ansClsf != ''">
-		AND     ANS_CLSF = #{ansClsf}
-		</if>
-		<if test="useYn != null and useYn != ''">
-		AND     USE_YN = #{useYn}
-		</if>
-		<if test="ansTitle != null and ansTitle != ''">
-		AND     ANS_TITLE LIKE CONCAT('%',#{ansTitle},'%')
-		</if>
-		ORDER   BY SITE_CD, ANS_CLSF, ANS_SQ
-	</select>
-
-	<!-- 기본답변문구 등록/수정 -->
-	<insert id="saveAnswerPhase" parameterType="AnswerPhase">
-		/* TsaAnswerPhase.saveAnswerPhase */
-		INSERT INTO TB_ANS_PHASE (
-		       ANS_SQ
-		     , ANS_CLSF
-		     , SITE_CD
-		     , ANS_TITLE
-		     , ANS_CONTENT
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       NULL
-		     , #{ansClsf}
-		     , #{siteCd}
-		     , #{ansTitle}
-		     , #{ansContent}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       SITE_CD = #{siteCd}
-		     , ANS_CLSF = #{ansClsf}
-		     , ANS_TITLE = #{ansTitle}
-		     , ANS_CONTENT = #{ansContent}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaAnswerPhaseDao">
+
+	<!-- 답변문구 목록 -->
+	<select id="getAnswerPhaseList" parameterType="AnswerPhase" resultType="AnswerPhase">
+		/* TsaAnswerPhase.getAnswerPhaseList */
+		 SELECT SITE_CD                                      /*사이트코드*/
+		      , ANS_SQ                                       /*답변일련번호*/
+		      , ANS_CLSF                                     /*답변종류코드*/
+		      , ANS_TITLE                                    /*답변제목*/
+		      , ANS_CONTENT                                  /*답변내용*/
+		      , USE_YN                                       /*사용여부*/
+		      , FN_GET_USER_NM(REG_NO)             AS REG_NM /*등록자*/
+		      , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT /*등록일자*/
+		      , FN_GET_USER_NM(UPD_NO)             AS UPD_NM /*수정자*/
+		      , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT /*수정일자*/
+		FROM    TB_ANS_PHASE
+		WHERE   1 = 1
+		<if test="siteCd != null and siteCd != ''">
+		AND     SITE_CD = #{siteCd}
+		</if>
+		<if test="ansClsf != null and ansClsf != ''">
+		AND     ANS_CLSF = #{ansClsf}
+		</if>
+		<if test="useYn != null and useYn != ''">
+		AND     USE_YN = #{useYn}
+		</if>
+		<if test="ansTitle != null and ansTitle != ''">
+		AND     ANS_TITLE LIKE CONCAT('%',#{ansTitle},'%')
+		</if>
+		ORDER   BY SITE_CD, ANS_CLSF, ANS_SQ
+	</select>
+
+	<!-- 기본답변문구 등록/수정 -->
+	<insert id="saveAnswerPhase" parameterType="AnswerPhase">
+		/* TsaAnswerPhase.saveAnswerPhase */
+		INSERT INTO TB_ANS_PHASE (
+		       ANS_SQ
+		     , ANS_CLSF
+		     , SITE_CD
+		     , ANS_TITLE
+		     , ANS_CONTENT
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       NULL
+		     , #{ansClsf}
+		     , #{siteCd}
+		     , #{ansTitle}
+		     , #{ansContent}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       SITE_CD = #{siteCd}
+		     , ANS_CLSF = #{ansClsf}
+		     , ANS_TITLE = #{ansTitle}
+		     , ANS_CONTENT = #{ansContent}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+
 </mapper>

+ 810 - 810
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml

@@ -1,811 +1,811 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaBusinessDao">
-
-	<!-- 공급업체 목록 -->
-	<select id="getSupplyCompanyList" parameterType="SupplyCompany" resultType="SupplyCompany">
-		/* TsaBusiness.getSupplyCompanyList */
-		SELECT SUPPLY_COMP_CD       /*공급업체코드*/
-		     , SUPPLY_COMP_NM       /*공급업체명*/
-		     , BIZ_GB               /*사업자구분*/
-		     , BIZ_NO               /*사업자등록번호*/
-		     , BIZ_KIND             /*업종*/
-		     , BIZ_TYPE             /*업태*/
-		     , OWNER_NM             /*대표자명*/
-		     , BIZ_ZIPCODE          /*사업장우편번호*/
-		     , BIZ_BASE_ADDR        /*사업장기본주소*/
-		     , BIZ_DTL_ADDR         /*사업장상세주소*/
-		     , MAIN_TELNO           /*대표전화번호*/
-		     , MAIN_FAXNO           /*대표팩스번호*/
-		     , HOMEPAGE_URL         /*홈페이지URL*/
-		     , DISTRIBUTION_GB      /*유통구분*/
-		     , SHOT_DELV_YN         /*총알배송여부*/
-		     , SUPPLY_STAT          /*입점상태*/
-		     , MIN_ORD_AMT          /*무료배송비최소주문금액*/
-		     , DELV_FEE             /*배송비*/
-		     , SELL_FEE_RATE        /*판매수수료율*/
-		     , SETTLE_DAY           /*정산일*/
-		     , BANK_CD              /*은행코드*/
-		     , ACCOUNT_NO           /*계좌번호*/
-		     , DEPOSITOR_NM         /*예금주명*/
-		     , CS_CHARGE_NM         /*CS담당자명*/
-		     , CS_CHARGE_TELNO      /*CS담당자전화번호*/
-		     , SETTLE_CHARGE_NM     /*정산담당자명*/
-		     , SETTLE_CHARGE_TELNO  /*정산담당자전화번호*/
-		     , SETTLE_CHARGE_EMAIL  /*정산담당자이메일*/
-		     , BILL_EMAIL           /*계산서이메일*/
-		     , ECONTRACT_YN         /*전자계약여부*/
-		     , REMARKS              /*비고*/
-		     , USE_YN               /*사용여부*/
-		FROM   TB_SUPPLY_COMPANY
-		WHERE  1 = 1
-		<if test="supplyStat != null and supplyStat != ''">
-		AND    SUPPLY_STAT = #{supplyStat}
-		</if>
-		<if test="searchTxt != null and searchTxt != ''">
-		    <if test='searchGb == "NAME"'>
-		AND    UPPER(SUPPLY_COMP_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
-		    </if>
-		    <if test='searchGb == "OWNER"'>
-		AND    UPPER(OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
-		    </if>
-		</if>
-		<if test="econtractYn != null and econtractYn != ''">
-		AND    ECONTRACT_YN = #{econtractYn}
-		</if>
-		<if test="supplyCompCd != null and supplyCompCd != ''"> <!-- 브랜드관리 화면에서 사용 -->
-		AND    SUPPLY_COMP_CD = #{supplyCompCd}
-		</if>
-	</select>
-	
-	<!-- 공급업체 생성 -->
-	<insert id="createSupplyCompany" parameterType="SupplyCompany">
-		/* TsaBusiness.createSupplyCompany */
-		INSERT INTO TB_SUPPLY_COMPANY (
-		       SUPPLY_COMP_CD
-		     , SUPPLY_COMP_NM
-		     , BIZ_GB
-		     , BIZ_NO
-		     , BIZ_KIND
-		     , BIZ_TYPE
-		     , OWNER_NM
-		     , BIZ_ZIPCODE
-		     , BIZ_BASE_ADDR
-		     , BIZ_DTL_ADDR
-		     , MAIN_TELNO
-		     , MAIN_FAXNO
-		     , HOMEPAGE_URL
-		     , DISTRIBUTION_GB
-		     , SHOT_DELV_YN
-		     , SUPPLY_STAT
-		     , MIN_ORD_AMT
-		     , DELV_FEE
-		     , SELL_FEE_RATE
-		     , SETTLE_DAY
-		     , BANK_CD
-		     , ACCOUNT_NO
-		     , DEPOSITOR_NM
-		     , CS_CHARGE_NM
-		     , CS_CHARGE_TELNO
-		     , SETTLE_CHARGE_NM
-		     , SETTLE_CHARGE_TELNO
-		     , SETTLE_CHARGE_EMAIL
-		     , BILL_EMAIL
-		     , ECONTRACT_YN
-		     , REMARKS
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       (SELECT CONCAT('S',IFNULL(LPAD(SUBSTRING(MAX(SUPPLY_COMP_CD),2) + 1,4,'0'),'0000'))
-		        FROM   TB_SUPPLY_COMPANY Z
-		        WHERE  SUPPLY_COMP_CD LIKE 'S%'
-		       )
-		     , #{supplyCompNm}
-		     , #{bizGb}
-		     , #{bizNo}
-		     , #{bizKind}
-		     , #{bizType}
-		     , #{ownerNm}
-		     , #{bizZipcode}
-		     , #{bizBaseAddr}
-		     , #{bizDtlAddr}
-		     , #{mainTelno}
-		     , #{mainFaxno}
-		     , #{homepageUrl}
-		     , #{distributionGb}
-		     , #{shotDelvYn}
-		     , #{supplyStat}
-		     , IFNULL(#{minOrdAmt},0)
-		     , IFNULL(#{delvFee},0)
-		     , IFNULL(#{sellFeeRate},0.0)
-		     , #{settleDay}
-		     , #{bankCd}
-		     , #{accountNo}
-		     , #{depositorNm}
-		     , #{csChargeNm}
-		     , #{csChargeTelno}
-		     , #{settleChargeNm}
-		     , #{settleChargeTelno}
-		     , #{settleChargeEmail}
-		     , #{billEmail}
-		     , #{econtractYn}
-		     , #{remarks}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-	</insert>
-	
-	<!-- 공급업체 수정 -->
-	<update id="updateSupplyCompany" parameterType="SupplyCompany">
-		/* TsaBusiness.updateSupplyCompany */
-		UPDATE TB_SUPPLY_COMPANY
-		SET    SUPPLY_COMP_NM = #{supplyCompNm}
-		     , BIZ_GB = #{bizGb}
-		     , BIZ_NO = #{bizNo}
-		     , BIZ_KIND = #{bizKind}
-		     , BIZ_TYPE = #{bizType}
-		     , OWNER_NM = #{ownerNm}
-		     , BIZ_ZIPCODE = #{bizZipcode}
-		     , BIZ_BASE_ADDR = #{bizBaseAddr}
-		     , BIZ_DTL_ADDR = #{bizDtlAddr}
-		     , MAIN_TELNO = #{mainTelno}
-		     , MAIN_FAXNO = #{mainFaxno}
-		     , HOMEPAGE_URL = #{homepageUrl}
-		     , DISTRIBUTION_GB = #{distributionGb}
-		     , SHOT_DELV_YN = #{shotDelvYn}
-		     , SUPPLY_STAT = #{supplyStat}
-		     , MIN_ORD_AMT = IFNULL(#{minOrdAmt},0)
-		     , DELV_FEE = IFNULL(#{delvFee},0)
-		     , SELL_FEE_RATE = IFNULL(#{sellFeeRate},0.0)
-		     , SETTLE_DAY = #{settleDay}
-		     , BANK_CD = #{bankCd}
-		     , ACCOUNT_NO = #{accountNo}
-		     , DEPOSITOR_NM = #{depositorNm}
-		     , CS_CHARGE_NM = #{csChargeNm}
-		     , CS_CHARGE_TELNO = #{csChargeTelno}
-		     , SETTLE_CHARGE_NM = #{settleChargeNm}
-		     , SETTLE_CHARGE_TELNO = #{settleChargeTelno}
-		     , SETTLE_CHARGE_EMAIL = #{settleChargeEmail}
-		     , BILL_EMAIL = #{billEmail}
-		     , ECONTRACT_YN = #{econtractYn}
-		     , REMARKS = #{remarks}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  SUPPLY_COMP_CD = #{supplyCompCd}
-	</update>
-	
-	<!-- 출고처 목록 -->
-	<select id="getDeliveryLocList" parameterType="DeliveryLoc" resultType="DeliveryLoc">
-		/* TsaBusiness.getDeliveryLocList */
-		SELECT DELV_LOC_CD        /*출고처코드*/
-		     , DELV_LOC_NM        /*출고처명*/
-		     , SUPPLY_COMP_CD     /*공급업체코드*/
-		     , DELV_LOC_CLSF      /*출고처분류*/
-		     , DELV_ASSIGN_ORD    /*출고지정순서*/
-		     , DELV_ASSIGN_GRADE  /*출고지정등급*/
-		     , STOCK_APPL_RATE    /*재고적용율*/
-		     , DELV_FEE_RATE      /*출고수수료율*/
-		     , DELV_LOC_ZIPCODE   /*출고처우편번호*/
-		     , DELV_LOC_BASE_ADDR /*출고처기본주소*/
-		     , DELV_LOC_DTL_ADDR  /*출고처상세주소*/
-		     , RTN_LOC_ZIPCODE    /*반품처우편번호*/
-		     , RTN_LOC_BASE_ADDR  /*반품처기본주소*/
-		     , RTN_LOC_DTL_ADDR   /*반품처상세주소*/
-		     , RTN_LOC_NM         /*반품처명*/
-		     , INVOICE_PRINT_TYPE /*송장출력형태*/
-		     , USE_YN             /*사용여부*/
-		FROM   TB_DELIVERY_LOC
-		WHERE  1 = 1
-		<if test="supplyCompCd != null and supplyCompCd != ''">
-		AND    LOWER(SUPPLY_COMP_CD) LIKE CONCAT('%',LOWER(#{supplyCompCd}),'%')
-		</if>
-		<if test="delvLocNm != null and delvLocNm !=''">
-		AND    LOWER(DELV_LOC_NM) LIKE CONCAT('%',LOWER(#{delvLocNm}),'%')
-		</if>
-		<if test="delvLocClsf != null and delvLocClsf != ''">
-		AND    DELV_LOC_CLSF = #{delvLocClsf}
-		</if>
-		<if test="useYn != null and useYn != ''">
-		AND    USE_YN = #{useYn}
-		</if>
-		ORDER  BY DELV_LOC_CD
-	</select>
-
-	<!-- 출고처 저장 -->
-	<insert id="saveDeliveryLoc" parameterType="DeliveryLoc">
-		/*  TsaBusiness.saveDeliveryInfo */
-		INSERT INTO TB_DELIVERY_LOC (
-		       DELV_LOC_CD
-		     , DELV_LOC_NM
-		     , SUPPLY_COMP_CD
-		     , DELV_LOC_CLSF
-		     , DELV_ASSIGN_ORD
-		     , DELV_ASSIGN_GRADE
-		     , STOCK_APPL_RATE
-		     , DELV_FEE_RATE
-		     , DELV_LOC_ZIPCODE
-		     , DELV_LOC_BASE_ADDR
-		     , DELV_LOC_DTL_ADDR
-		     , RTN_LOC_ZIPCODE
-		     , RTN_LOC_BASE_ADDR
-		     , RTN_LOC_DTL_ADDR
-		     , RTN_LOC_NM
-		     , INVOICE_PRINT_TYPE
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{delvLocCd}
-		     , #{delvLocNm}
-		     , #{supplyCompCd}
-		     , #{delvLocClsf}
-		     , CASE WHEN #{delvLocClsf} IN ('G024_10','G024_21') THEN /*물류창고,직송매장*/
-		                IFNULL(#{delvAssignOrd},100)
-		            ELSE
-		                #{delvAssignOrd}
-		       END
-		     , #{delvAssignGrade}
-		     , CASE WHEN #{delvLocClsf} IN ('G024_10','G024_21') AND #{stockApplRate} = 0.0 THEN /*물류창고,직송매장*/
-		                IFNULL(#{stockApplRate},100.0)
-		            ELSE
-		                #{stockApplRate}
-		       END
-		     , CASE WHEN #{delvLocClsf} = 'G024_21' THEN /*직송매장*/
-		                IFNULL(#{delvFeeRate},0.0)
-		            ELSE
-		                #{delvFeeRate}
-		       END
-		     , #{delvLocZipcode}
-		     , #{delvLocBaseAddr}
-		     , #{delvLocDtlAddr}
-		     , #{rtnLocZipcode}
-		     , #{rtnLocBaseAddr}
-		     , #{rtnLocDtlAddr}
-		     , #{rtnLocNm}
-		     , #{invoicePrintType}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       DELV_LOC_NM = #{delvLocNm}
-		     , DELV_LOC_CLSF = #{delvLocClsf}
-		     , DELV_ASSIGN_ORD = CASE WHEN #{delvLocClsf} IN ('G024_10','G024_21') THEN /*물류창고,직송매장*/
-		                                  IFNULL(#{delvAssignOrd},100)
-		                              ELSE
-		                                  #{delvAssignOrd}
-		                         END
-		     , DELV_ASSIGN_GRADE = #{delvAssignGrade}
-		     , STOCK_APPL_RATE = CASE WHEN #{delvLocClsf} IN ('G024_10','G024_21') AND #{stockApplRate} = 0.0 THEN /*물류창고,직송매장*/
-		                                  100
-		                              ELSE
-		                                  #{stockApplRate}
-		                         END
-		     , DELV_FEE_RATE = CASE WHEN #{delvLocClsf} = 'G024_21' THEN /*직송매장*/
-		                                IFNULL(#{delvFeeRate},0.0)
-		                            ELSE
-		                                #{delvFeeRate}
-		                       END
-		     , DELV_LOC_ZIPCODE = #{delvLocZipcode}
-		     , DELV_LOC_BASE_ADDR = #{delvLocBaseAddr}
-		     , DELV_LOC_DTL_ADDR = #{delvLocDtlAddr}
-		     , RTN_LOC_ZIPCODE = #{rtnLocZipcode}
-		     , RTN_LOC_BASE_ADDR = #{rtnLocBaseAddr}
-		     , RTN_LOC_DTL_ADDR = #{rtnLocDtlAddr}
-		     , RTN_LOC_NM = #{rtnLocNm}
-		     , INVOICE_PRINT_TYPE = #{invoicePrintType}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
-	<!-- 브랜드 목록 -->
-	<select id="getBrandList" parameterType="Brand" resultType="Brand">
-		/* TsaBusiness.getBrandList */
-		SELECT CASE WHEN A.SELF_YN = 'Y' THEN 'S'
-		            ELSE 'N'
-		       END               AS BRAND_GB /*브랜드구분*/
-		     , A.BRAND_CD                    /*브랜드코드*/
-		     , A.BRAND_ENM                   /*브랜드영문명*/
-		     , A.BRAND_KNM                   /*브랜드한글명*/
-		     , A.BRAND_GRP_NM                /*브랜드그룹명*/
-		     , A.DISTRIBUTION_GB             /*유통구분*/
-		     , A.SUPPLY_COMP_CD              /*업체코드*/
-		     , B.SUPPLY_COMP_NM              /*업체명*/
-		     , A.DELV_LOC_CD                 /*출고처코드*/
-		     , C.DELV_LOC_NM                 /*출고처명*/
-		     , A.ERP_BRAND_CD                /*ERP브랜드코드*/
-		     , A.SELF_YN                     /*자사여부*/
-		     , A.DELV_FEE                    /*기본배송비*/
-		     , A.MIN_ORD_AMT                 /*무료배송비기준*/
-		     , A.SELL_FEE_RATE               /*판매수수료율*/
-		     , A.USE_YN                      /*사용여부*/
-		     , A.PNT_PRATE10                 /*포인트적립율(PC)*/
-		     , A.PNT_MRATE10                 /*포인트적립율(모바일)*/
-		     , A.PNT_PRATE20                 /*포인트적립율(PC)*/
-		     , A.PNT_MRATE20                 /*포인트적립율(모바일)*/
-		     , A.DISP_ORD                    /*표시순서*/
-		FROM   TB_BRAND A
-		INNER JOIN TB_SUPPLY_COMPANY B ON A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
-		LEFT OUTER JOIN TB_DELIVERY_LOC C ON A.DELV_LOC_CD = C.DELV_LOC_CD
-		WHERE  1 = 1
-		<if test='supplyCompCd != null and supplyCompCd != ""'>
-		AND    A.SUPPLY_COMP_CD = #{supplyCompCd}
-		</if>
-		<if test='distributionGb != null and distributionGb != ""'>
-		AND    A.DISTRIBUTION_GB = #{distributionGb}
-		</if>
-		<if test='erpBrandCd != null and erpBrandCd != ""'>
-		AND    A.ERP_BRAND_CD =  #{erpBrandCd}
-		</if>
-		<if test='brandCd != null and brandCd != ""'>
-		AND    A.BRAND_CD = #{brandCd}
-		</if>
-		<if test='searchTxt != null and searchTxt != ""'>
-		AND    (
-		        A.BRAND_CD LIKE CONCAT('%',#{searchTxt},'%')
-		        OR
-		        A.BRAND_ENM LIKE CONCAT('%',#{searchTxt},'%')
-		        OR
-		        A.BRAND_KNM LIKE CONCAT('%',#{searchTxt},'%')
-		        OR
-		        A.BRAND_GRP_NM LIKE CONCAT('%',#{searchTxt},'%')
-		       )
-		</if>
-		<if test='useYn != null and useYn != ""'>
-		AND    A.USE_YN = #{useYn}
-		</if>
-		ORDER  BY A.SELF_YN DESC, A.SUPPLY_COMP_CD, A.DISP_ORD
-	</select>
-	
-	<!-- 담당MD 목록 -->
-	<select id="getMdList" parameterType="String" resultType="BrandMd">
-		/* TsaBusiness.getMdList */
-		SELECT USER_NO AS MD_NO
-		     , USER_NM AS MD_NM
-		FROM   TB_USER
-		WHERE  ROLE_CD = 'G001_A101' /*MD권한*/
-		<if test="mdNm != null and mdNm != ''">
-		AND    LOWER(USER_NM) LIKE CONCAT('%',LOWER(#{mdNm}),'%')
-		</if>
-		AND    USE_YN  = 'Y'
-		ORDER  BY USER_NM
-	</select>
-	
-	<!-- 브랜드담당MD 목록 -->
-	<select id="getBrandMdList" parameterType="String" resultType="BrandMd">
-		/* TsaBusiness.getBrandMdList */
-		SELECT A.FORMAL_GB           /*정상이월구분*/
-		     , A.MD_NO               /*담당MD번호*/
-		     , B.USER_NM    AS MD_NM /*담당MD명*/
-		FROM   TB_BRAND_MD A
-		     , TB_USER B
-		WHERE  A.MD_NO = B.USER_NO
-		AND    A.BRAND_CD = #{brandCd}
-	</select>
-	
-	<!-- 브랜드담당MD 삭제 -->
-	<delete id="deleteBrandMd" parameterType="String">
-		/* TsaBusiness.deleteBrandMd */
-		DELETE
-		FROM   TB_BRAND_MD
-		WHERE  BRAND_CD = #{brandCd}
-	</delete>
-
-	<!-- 브랜드담당MD 등록 -->
-	<insert id="createBrandMd" parameterType="BrandMd">
-		/* TsaBusiness.createBrandMd */
-		INSERT INTO TB_BRAND_MD (
-		       BRAND_CD
-		     , FORMAL_GB
-		     , MD_NO
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		SELECT #{brandCd}  AS BRAND_CD
-		     , CD          AS FORMAL_GB
-		     , #{mdNo}     AS MD_NO
-		     , #{regNo}    AS REG_NO
-		     , NOW()       AS REG_DT
-		     , #{updNo}    AS UPD_NO
-		     , NOW()       AS UPD_DT
-		FROM   TB_COMMON_CODE
-		WHERE  CD_GB = 'G009' /*정상이월구분*/
-		AND    CD IN ('G009_10','G009_20') /*정상,이월*/
-		AND    USE_YN = 'Y'
-	</insert>
-	
-	<!-- 브랜드 노출사이트 목록 -->
-	<select id="getBrandSiteList" parameterType="String" resultType="SiteBrand">
-		/* TsaBusiness.getBrandSiteList */
-		SELECT BRAND_CD
-		     , SITE_CD
-		     , DISP_ORD
-		     , USE_YN
-		     , CATE1_NO
-		FROM   TB_SITE_BRAND
-		WHERE  BRAND_CD = #{brandCd}
-		AND    USE_YN ='Y'
-	</select>
-	
-	<!-- 브랜드 노출사이트 등록/수정 -->
-	<insert id="saveBrandSite" parameterType="SiteBrand">
-		/* TsaBusiness.saveBrandSite */
-		INSERT INTO TB_SITE_BRAND (
-		       SITE_CD
-		     , BRAND_CD
-		     , DISP_ORD
-		     , USE_YN
-		     , CATE1_NO
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{siteCd}
-		     , #{brandCd}
-		     , #{dispOrd}
-		     , #{useYn}
-		     , #{cate1No}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
-	<!-- 브랜드 등록 -->
-	<insert id="createBrand" parameterType="Brand">
-		/* TsaBusiness.createBrand */
-		INSERT INTO TB_BRAND (
-		       BRAND_CD
-		     , BRAND_ENM
-		     , BRAND_KNM
-		     , BRAND_GRP_NM
-		     , SUPPLY_COMP_CD
-		     , DISTRIBUTION_GB
-		     , SELF_YN
-		     , ERP_BRAND_CD
-		     , MIN_ORD_AMT
-		     , DELV_FEE
-		     , DELV_LOC_CD
-		     , SELL_FEE_RATE
-		     , PNT_PRATE10
-		     , PNT_MRATE10
-		     , PNT_PRATE20
-		     , PNT_MRATE20
-		     , DISP_ORD
-		     , USE_YN
-		     , DISP_ORD
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       (SELECT CONCAT(#{brandGb},IFNULL(LPAD(CAST(SUBSTRING(MAX(BRAND_CD),2) AS UNSIGNED) + 1,3,'0'),'000'))
-		        FROM   TB_BRAND Z
-		        WHERE  BRAND_CD LIKE CONCAT(#{brandGb},'%')
-		       )
-		     , #{brandEnm}
-		     , #{brandKnm}
-		     , #{brandGrpNm}
-		     , #{supplyCompCd}
-		     , #{distributionGb}
-		     , CASE WHEN #{distributionGb} IN ('G065_10','G065_11','G065_12') THEN 'Y'
-		            ELSE 'N'
-		       END
-		     , #{erpBrandCd}
-		     , IFNULL(#{minOrdAmt},0)
-		     , IFNULL(#{delvFee},0)
-		     , #{delvLocCd}
-		     , IFNULL(#{sellFeeRate},0)
-		     , IFNULL(#{pntPrate10},0)
-		     , IFNULL(#{pntMrate10},0)
-		     , IFNULL(#{pntPrate20},0)
-		     , IFNULL(#{pntMrate20},0)
-		     , #{dispOrd}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-	</insert>
-	
-	<!-- 브랜드 수정 -->
-	<insert id="updateBrand" parameterType="Brand">
-		/* TsaBusiness.updateBrand */
-		UPDATE TB_BRAND
-		SET    BRAND_ENM = #{brandEnm}
-		     , BRAND_KNM = #{brandKnm}
-		     , BRAND_GRP_NM = #{brandGrpNm}
-		     , SUPPLY_COMP_CD = #{supplyCompCd}
-		     , DISTRIBUTION_GB = #{distributionGb}
-		     , SELF_YN = CASE WHEN #{distributionGb} IN ('G065_10','G065_11','G065_12') THEN 'Y'
-		                      ELSE 'N'
-		                 END
-		     , ERP_BRAND_CD = #{erpBrandCd}
-		     , MIN_ORD_AMT = IFNULL(#{minOrdAmt},0)
-		     , DELV_FEE = IFNULL(#{delvFee},0)
-		     , DELV_LOC_CD = #{delvLocCd}
-		     , SELL_FEE_RATE = IFNULL(#{sellFeeRate},0)
-		     , PNT_PRATE10 = IFNULL(#{pntPrate10},0)
-		     , PNT_MRATE10 = IFNULL(#{pntMrate10},0)
-		     , PNT_PRATE20 = IFNULL(#{pntPrate20},0)
-		     , PNT_MRATE20 = IFNULL(#{pntMrate20},0)
-		     , DISP_ORD = #{dispOrd}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  BRAND_CD = #{brandCd}
-	</insert>
-	
-	<!-- 재고연계관리 - 출고처 목록 -->
-	<select id="getStockSyncDeliveryLocList" parameterType="DeliveryLoc" resultType="DeliveryLoc">
-		/* TsaBusiness.getStockSyncDeliveryLocList */
-		SELECT SUPPLY_COMP_CD
-		     , DELV_LOC_CD
-		     , DELV_LOC_NM
-		     , DELV_LOC_CLSF
-		     , FN_GET_CODE_NM('G024',DELV_LOC_CLSF) AS DELV_LOC_CLSF_NM
-		FROM   TB_DELIVERY_LOC
-		WHERE  SUPPLY_COMP_CD = #{supplyCompCd}
-		AND    DELV_LOC_CLSF IN ('G024_10','G024_21') /*물류창고,직송매장*/
-		<if test="delvLocClsf != null and delvLocClsf != ''">
-		AND    DELV_LOC_CLSF = #{delvLocClsf}
-		</if>
-		<if test="searchTxt != null and searchTxt != ''">
-		    <if test="searchGb == 'CODE'">
-		AND    DELV_LOC_CD = #{delvLocCd}
-		    </if>
-		    <if test="searchGb == 'NAME'">
-		AND    DELV_LOC_NM like CONCAT('%',#{delvLocNm},'%')
-		    </if>
-		</if>
-		AND    USE_YN = 'Y'
-		ORDER  BY DELV_LOC_NM
-	</select>
-
-	<!-- 재고연계관리 - 재고연계기준 목록 -->
-	<select id="getStockSyncBaseList" parameterType="StockSyncBase" resultType="StockSyncBase">
-		/* TsaBusiness.getStockSyncBaseList */
-		SELECT X.DELV_LOC_CD
-		     , X.BRAND_CD
-		     , X.ERP_BRAND_CD
-		     , X.BRAND_KNM
-		     , X.BRAND_ENM
-		     , IFNULL(Y.STOCK_SYNC_YN,'N') AS PREV_STOCK_SYNC_YN /*이전재고연계여부*/
-		     , IFNULL(Y.STOCK_SYNC_YN,'N') AS STOCK_SYNC_YN      /*재고연계여부*/
-		     , IFNULL(Y.DELV_SYNC_YN,'N')  AS PREV_DELV_SYNC_YN  /*이전출고연계여부*/
-		     , IFNULL(Y.DELV_SYNC_YN,'N')  AS DELV_SYNC_YN       /*출고연계여부*/
-		FROM   (
-		        SELECT A.DELV_LOC_CD
-		             , B.BRAND_CD
-		             , B.ERP_BRAND_CD
-		             , B.BRAND_KNM
-		             , B.BRAND_ENM
-		        FROM   TB_DELIVERY_LOC A
-		             , TB_BRAND B
-		        WHERE  A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
-		        AND    A.SUPPLY_COMP_CD = #{supplyCompCd}
-		        AND    A.DELV_LOC_CD = #{delvLocCd}
-		        AND    A.USE_YN = 'Y'
-		       ) X
-		LEFT OUTER JOIN TB_STOCK_SYNC_BASE Y ON X.DELV_LOC_CD = Y.DELV_LOC_CD
-		                                    AND X.BRAND_CD = Y.BRAND_CD
-		ORDER BY X.DELV_LOC_CD, X.BRAND_CD
-	</select>
-
-	<!-- 재고연계관리 - 재고연계기준 저장 -->
-	<insert id="saveStockSyncBase" parameterType="StockSyncBase">
-		/* TsaBusiness.saveStockSyncBase */
-		INSERT INTO TB_STOCK_SYNC_BASE (
-		       DELV_LOC_CD
-		     , BRAND_CD
-		     , FORMAL_GB
-		     , STOCK_SYNC_YN
-		     , DELV_SYNC_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{delvLocCd}
-		     , #{brandCd}
-		     , IFNULL(#{formalGb},'G009_10')
-		     , #{stockSyncYn}
-		     , #{delvSyncYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       STOCK_SYNC_YN = #{stockSyncYn}
-		     , DELV_SYNC_YN = #{delvSyncYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-
-	<!-- 판매매장 목록  -->
-	<select id="getSellStoreList" parameterType="SellStore" resultType="SellStore">
-		/* TsaBusiness.getSellStoreList */
-		SELECT SELL_STORE_CD
-		     , SELL_STORE_NM
-		     , USE_YN
-		FROM   TB_SELL_STORE
-		WHERE  1 = 1
-		<if test="sellStoreNm != null and sellStoreNm != ''">
-		AND    LOWER(SELL_STORE_NM) LIKE CONCAT('%',LOWER(#{sellStoreNm}),'%')
-		</if>
-		<if test="useYn != null and useYn != ''">
-		AND    USE_YN = #{useYn}
-		</if>
-		ORDER  BY SELL_STORE_NM
-	</select>
-
-	<!-- 판매매장 등록/수정 -->
-	<insert id="saveSellStore" parameterType="SellStore">
-		/* TsaBusiness.saveSellStore */
-		INSERT INTO TB_SELL_STORE (
-		       SUPPLY_COMP_CD
-		     , SELL_STORE_CD
-		     , SELL_STORE_NM
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{supplyCompCd}
-		     , #{sellStoreCd}
-		     , #{sellStoreNm}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       SELL_STORE_CD = #{sellStoreCd}
-		     , SELL_STORE_NM = #{sellStoreNm}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
-	<!-- 제휴링크 목록 -->
-	<select id="getAflinkList" parameterType="Aflink" resultType="Aflink">
-		/*  TsaBusiness.getAflinkList */
-		SELECT AF_LINK_CD
-		     , AF_LINK_NM
-		     , AF_CHANNEL
-		     , DISP_ORD
-		     , USE_YN
-		FROM   TB_AF_LINK
-		WHERE  1 = 1
-		<if test="afChannel != null and afChannel != ''">
-		AND    AF_CHANNEL = #{afChannel}
-		</if>
-	</select>
-
-	<!-- 제휴링크 저장 -->
-	<insert id="saveAflink" parameterType="Aflink">
-		/* TsaBusiness.saveAflink */
-		INSERT INTO TB_AF_LINK (
-		       AF_LINK_CD
-		     , AF_LINK_NM
-		     , AF_CHANNEL
-		     , DISP_ORD
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{afLinkCd}
-		     , #{afLinkNm}
-		     , #{afChannel}
-		     , #{dispOrd}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       AF_LINK_NM = #{afLinkNm}
-		     , AF_CHANNEL = #{afChannel}
-		     , DISP_ORD = #{dispOrd}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-
-	<!-- 제휴링크 삭제 -->
-	<update id="deleteAflink" parameterType="Aflink">
-		/* TsaBusiness.deleteAflink */
-		UPDATE TB_AF_LINK
-		SET    USE_YN = 'N'
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  AF_LINK_CD = #{afLinkCd}
-	</update>
-	
-	<!-- 배송업체관리 목록 -->
-	<select id="getShipCompanyList" resultType="ShipCompany">
-		/* TsaBusiness.getShipCompanyList */
-		SELECT SHIP_COMP_CD
-		     , SHIP_COMP_NM
-		     , TRACKING_URL
-		     , USE_YN
-		FROM   TB_SHIP_COMPANY
-		ORDER  BY SHIP_COMP_CD
-	</select>
-
-	<!-- 배송업체관리 저장 -->
-	<insert id="saveShipCompany" parameterType="ShipCompany">
-		/* TsaBusiness.saveShipCompany */
-		INSERT INTO TB_SHIP_COMPANY (
-		       SHIP_COMP_CD
-		     , SHIP_COMP_NM
-		     , TRACKING_URL
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{shipCompCd}
-		     , #{shipCompNm}
-		     , #{trackingUrl}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       SHIP_COMP_NM = #{shipCompNm}
-		     , TRACKING_URL = #{trackingUrl}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
-	<!-- 배송업체관리 삭제 -->
-	<update id="deleteShipCompany" parameterType="ShipCompany">
-		/* TsaBusiness.updateShipCompany */
-		UPDATE TB_SHIP_COMPANY
-		SET    USE_YN = 'N'
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  SHIP_COMP_CD=  #{shipCompCd}
-	</update>
-	
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaBusinessDao">
+
+	<!-- 공급업체 목록 -->
+	<select id="getSupplyCompanyList" parameterType="SupplyCompany" resultType="SupplyCompany">
+		/* TsaBusiness.getSupplyCompanyList */
+		SELECT SUPPLY_COMP_CD       /*공급업체코드*/
+		     , SUPPLY_COMP_NM       /*공급업체명*/
+		     , BIZ_GB               /*사업자구분*/
+		     , BIZ_NO               /*사업자등록번호*/
+		     , BIZ_KIND             /*업종*/
+		     , BIZ_TYPE             /*업태*/
+		     , OWNER_NM             /*대표자명*/
+		     , BIZ_ZIPCODE          /*사업장우편번호*/
+		     , BIZ_BASE_ADDR        /*사업장기본주소*/
+		     , BIZ_DTL_ADDR         /*사업장상세주소*/
+		     , MAIN_TELNO           /*대표전화번호*/
+		     , MAIN_FAXNO           /*대표팩스번호*/
+		     , HOMEPAGE_URL         /*홈페이지URL*/
+		     , DISTRIBUTION_GB      /*유통구분*/
+		     , SHOT_DELV_YN         /*총알배송여부*/
+		     , SUPPLY_STAT          /*입점상태*/
+		     , MIN_ORD_AMT          /*무료배송비최소주문금액*/
+		     , DELV_FEE             /*배송비*/
+		     , SELL_FEE_RATE        /*판매수수료율*/
+		     , SETTLE_DAY           /*정산일*/
+		     , BANK_CD              /*은행코드*/
+		     , ACCOUNT_NO           /*계좌번호*/
+		     , DEPOSITOR_NM         /*예금주명*/
+		     , CS_CHARGE_NM         /*CS담당자명*/
+		     , CS_CHARGE_TELNO      /*CS담당자전화번호*/
+		     , SETTLE_CHARGE_NM     /*정산담당자명*/
+		     , SETTLE_CHARGE_TELNO  /*정산담당자전화번호*/
+		     , SETTLE_CHARGE_EMAIL  /*정산담당자이메일*/
+		     , BILL_EMAIL           /*계산서이메일*/
+		     , ECONTRACT_YN         /*전자계약여부*/
+		     , REMARKS              /*비고*/
+		     , USE_YN               /*사용여부*/
+		FROM   TB_SUPPLY_COMPANY
+		WHERE  1 = 1
+		<if test="supplyStat != null and supplyStat != ''">
+		AND    SUPPLY_STAT = #{supplyStat}
+		</if>
+		<if test="searchTxt != null and searchTxt != ''">
+		    <if test='searchGb == "NAME"'>
+		AND    UPPER(SUPPLY_COMP_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		    </if>
+		    <if test='searchGb == "OWNER"'>
+		AND    UPPER(OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
+		    </if>
+		</if>
+		<if test="econtractYn != null and econtractYn != ''">
+		AND    ECONTRACT_YN = #{econtractYn}
+		</if>
+		<if test="supplyCompCd != null and supplyCompCd != ''"> <!-- 브랜드관리 화면에서 사용 -->
+		AND    SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+	</select>
+	
+	<!-- 공급업체 생성 -->
+	<insert id="createSupplyCompany" parameterType="SupplyCompany">
+		/* TsaBusiness.createSupplyCompany */
+		INSERT INTO TB_SUPPLY_COMPANY (
+		       SUPPLY_COMP_CD
+		     , SUPPLY_COMP_NM
+		     , BIZ_GB
+		     , BIZ_NO
+		     , BIZ_KIND
+		     , BIZ_TYPE
+		     , OWNER_NM
+		     , BIZ_ZIPCODE
+		     , BIZ_BASE_ADDR
+		     , BIZ_DTL_ADDR
+		     , MAIN_TELNO
+		     , MAIN_FAXNO
+		     , HOMEPAGE_URL
+		     , DISTRIBUTION_GB
+		     , SHOT_DELV_YN
+		     , SUPPLY_STAT
+		     , MIN_ORD_AMT
+		     , DELV_FEE
+		     , SELL_FEE_RATE
+		     , SETTLE_DAY
+		     , BANK_CD
+		     , ACCOUNT_NO
+		     , DEPOSITOR_NM
+		     , CS_CHARGE_NM
+		     , CS_CHARGE_TELNO
+		     , SETTLE_CHARGE_NM
+		     , SETTLE_CHARGE_TELNO
+		     , SETTLE_CHARGE_EMAIL
+		     , BILL_EMAIL
+		     , ECONTRACT_YN
+		     , REMARKS
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       (SELECT CONCAT('S',IFNULL(LPAD(SUBSTRING(MAX(SUPPLY_COMP_CD),2) + 1,4,'0'),'0000'))
+		        FROM   TB_SUPPLY_COMPANY Z
+		        WHERE  SUPPLY_COMP_CD LIKE 'S%'
+		       )
+		     , #{supplyCompNm}
+		     , #{bizGb}
+		     , #{bizNo}
+		     , #{bizKind}
+		     , #{bizType}
+		     , #{ownerNm}
+		     , #{bizZipcode}
+		     , #{bizBaseAddr}
+		     , #{bizDtlAddr}
+		     , #{mainTelno}
+		     , #{mainFaxno}
+		     , #{homepageUrl}
+		     , #{distributionGb}
+		     , #{shotDelvYn}
+		     , #{supplyStat}
+		     , IFNULL(#{minOrdAmt},0)
+		     , IFNULL(#{delvFee},0)
+		     , IFNULL(#{sellFeeRate},0.0)
+		     , #{settleDay}
+		     , #{bankCd}
+		     , #{accountNo}
+		     , #{depositorNm}
+		     , #{csChargeNm}
+		     , #{csChargeTelno}
+		     , #{settleChargeNm}
+		     , #{settleChargeTelno}
+		     , #{settleChargeEmail}
+		     , #{billEmail}
+		     , #{econtractYn}
+		     , #{remarks}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 공급업체 수정 -->
+	<update id="updateSupplyCompany" parameterType="SupplyCompany">
+		/* TsaBusiness.updateSupplyCompany */
+		UPDATE TB_SUPPLY_COMPANY
+		SET    SUPPLY_COMP_NM = #{supplyCompNm}
+		     , BIZ_GB = #{bizGb}
+		     , BIZ_NO = #{bizNo}
+		     , BIZ_KIND = #{bizKind}
+		     , BIZ_TYPE = #{bizType}
+		     , OWNER_NM = #{ownerNm}
+		     , BIZ_ZIPCODE = #{bizZipcode}
+		     , BIZ_BASE_ADDR = #{bizBaseAddr}
+		     , BIZ_DTL_ADDR = #{bizDtlAddr}
+		     , MAIN_TELNO = #{mainTelno}
+		     , MAIN_FAXNO = #{mainFaxno}
+		     , HOMEPAGE_URL = #{homepageUrl}
+		     , DISTRIBUTION_GB = #{distributionGb}
+		     , SHOT_DELV_YN = #{shotDelvYn}
+		     , SUPPLY_STAT = #{supplyStat}
+		     , MIN_ORD_AMT = IFNULL(#{minOrdAmt},0)
+		     , DELV_FEE = IFNULL(#{delvFee},0)
+		     , SELL_FEE_RATE = IFNULL(#{sellFeeRate},0.0)
+		     , SETTLE_DAY = #{settleDay}
+		     , BANK_CD = #{bankCd}
+		     , ACCOUNT_NO = #{accountNo}
+		     , DEPOSITOR_NM = #{depositorNm}
+		     , CS_CHARGE_NM = #{csChargeNm}
+		     , CS_CHARGE_TELNO = #{csChargeTelno}
+		     , SETTLE_CHARGE_NM = #{settleChargeNm}
+		     , SETTLE_CHARGE_TELNO = #{settleChargeTelno}
+		     , SETTLE_CHARGE_EMAIL = #{settleChargeEmail}
+		     , BILL_EMAIL = #{billEmail}
+		     , ECONTRACT_YN = #{econtractYn}
+		     , REMARKS = #{remarks}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  SUPPLY_COMP_CD = #{supplyCompCd}
+	</update>
+	
+	<!-- 출고처 목록 -->
+	<select id="getDeliveryLocList" parameterType="DeliveryLoc" resultType="DeliveryLoc">
+		/* TsaBusiness.getDeliveryLocList */
+		SELECT DELV_LOC_CD        /*출고처코드*/
+		     , DELV_LOC_NM        /*출고처명*/
+		     , SUPPLY_COMP_CD     /*공급업체코드*/
+		     , DELV_LOC_CLSF      /*출고처분류*/
+		     , DELV_ASSIGN_ORD    /*출고지정순서*/
+		     , DELV_ASSIGN_GRADE  /*출고지정등급*/
+		     , STOCK_APPL_RATE    /*재고적용율*/
+		     , DELV_FEE_RATE      /*출고수수료율*/
+		     , DELV_LOC_ZIPCODE   /*출고처우편번호*/
+		     , DELV_LOC_BASE_ADDR /*출고처기본주소*/
+		     , DELV_LOC_DTL_ADDR  /*출고처상세주소*/
+		     , RTN_LOC_ZIPCODE    /*반품처우편번호*/
+		     , RTN_LOC_BASE_ADDR  /*반품처기본주소*/
+		     , RTN_LOC_DTL_ADDR   /*반품처상세주소*/
+		     , RTN_LOC_NM         /*반품처명*/
+		     , INVOICE_PRINT_TYPE /*송장출력형태*/
+		     , USE_YN             /*사용여부*/
+		FROM   TB_DELIVERY_LOC
+		WHERE  1 = 1
+		<if test="supplyCompCd != null and supplyCompCd != ''">
+		AND    LOWER(SUPPLY_COMP_CD) LIKE CONCAT('%',LOWER(#{supplyCompCd}),'%')
+		</if>
+		<if test="delvLocNm != null and delvLocNm !=''">
+		AND    LOWER(DELV_LOC_NM) LIKE CONCAT('%',LOWER(#{delvLocNm}),'%')
+		</if>
+		<if test="delvLocClsf != null and delvLocClsf != ''">
+		AND    DELV_LOC_CLSF = #{delvLocClsf}
+		</if>
+		<if test="useYn != null and useYn != ''">
+		AND    USE_YN = #{useYn}
+		</if>
+		ORDER  BY DELV_LOC_CD
+	</select>
+
+	<!-- 출고처 저장 -->
+	<insert id="saveDeliveryLoc" parameterType="DeliveryLoc">
+		/*  TsaBusiness.saveDeliveryInfo */
+		INSERT INTO TB_DELIVERY_LOC (
+		       DELV_LOC_CD
+		     , DELV_LOC_NM
+		     , SUPPLY_COMP_CD
+		     , DELV_LOC_CLSF
+		     , DELV_ASSIGN_ORD
+		     , DELV_ASSIGN_GRADE
+		     , STOCK_APPL_RATE
+		     , DELV_FEE_RATE
+		     , DELV_LOC_ZIPCODE
+		     , DELV_LOC_BASE_ADDR
+		     , DELV_LOC_DTL_ADDR
+		     , RTN_LOC_ZIPCODE
+		     , RTN_LOC_BASE_ADDR
+		     , RTN_LOC_DTL_ADDR
+		     , RTN_LOC_NM
+		     , INVOICE_PRINT_TYPE
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{delvLocCd}
+		     , #{delvLocNm}
+		     , #{supplyCompCd}
+		     , #{delvLocClsf}
+		     , CASE WHEN #{delvLocClsf} IN ('G024_10','G024_21') THEN /*물류창고,직송매장*/
+		                IFNULL(#{delvAssignOrd},100)
+		            ELSE
+		                #{delvAssignOrd}
+		       END
+		     , #{delvAssignGrade}
+		     , CASE WHEN #{delvLocClsf} IN ('G024_10','G024_21') AND #{stockApplRate} = 0.0 THEN /*물류창고,직송매장*/
+		                IFNULL(#{stockApplRate},100.0)
+		            ELSE
+		                #{stockApplRate}
+		       END
+		     , CASE WHEN #{delvLocClsf} = 'G024_21' THEN /*직송매장*/
+		                IFNULL(#{delvFeeRate},0.0)
+		            ELSE
+		                #{delvFeeRate}
+		       END
+		     , #{delvLocZipcode}
+		     , #{delvLocBaseAddr}
+		     , #{delvLocDtlAddr}
+		     , #{rtnLocZipcode}
+		     , #{rtnLocBaseAddr}
+		     , #{rtnLocDtlAddr}
+		     , #{rtnLocNm}
+		     , #{invoicePrintType}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       DELV_LOC_NM = #{delvLocNm}
+		     , DELV_LOC_CLSF = #{delvLocClsf}
+		     , DELV_ASSIGN_ORD = CASE WHEN #{delvLocClsf} IN ('G024_10','G024_21') THEN /*물류창고,직송매장*/
+		                                  IFNULL(#{delvAssignOrd},100)
+		                              ELSE
+		                                  #{delvAssignOrd}
+		                         END
+		     , DELV_ASSIGN_GRADE = #{delvAssignGrade}
+		     , STOCK_APPL_RATE = CASE WHEN #{delvLocClsf} IN ('G024_10','G024_21') AND #{stockApplRate} = 0.0 THEN /*물류창고,직송매장*/
+		                                  100
+		                              ELSE
+		                                  #{stockApplRate}
+		                         END
+		     , DELV_FEE_RATE = CASE WHEN #{delvLocClsf} = 'G024_21' THEN /*직송매장*/
+		                                IFNULL(#{delvFeeRate},0.0)
+		                            ELSE
+		                                #{delvFeeRate}
+		                       END
+		     , DELV_LOC_ZIPCODE = #{delvLocZipcode}
+		     , DELV_LOC_BASE_ADDR = #{delvLocBaseAddr}
+		     , DELV_LOC_DTL_ADDR = #{delvLocDtlAddr}
+		     , RTN_LOC_ZIPCODE = #{rtnLocZipcode}
+		     , RTN_LOC_BASE_ADDR = #{rtnLocBaseAddr}
+		     , RTN_LOC_DTL_ADDR = #{rtnLocDtlAddr}
+		     , RTN_LOC_NM = #{rtnLocNm}
+		     , INVOICE_PRINT_TYPE = #{invoicePrintType}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 브랜드 목록 -->
+	<select id="getBrandList" parameterType="Brand" resultType="Brand">
+		/* TsaBusiness.getBrandList */
+		SELECT CASE WHEN A.SELF_YN = 'Y' THEN 'S'
+		            ELSE 'N'
+		       END               AS BRAND_GB /*브랜드구분*/
+		     , A.BRAND_CD                    /*브랜드코드*/
+		     , A.BRAND_ENM                   /*브랜드영문명*/
+		     , A.BRAND_KNM                   /*브랜드한글명*/
+		     , A.BRAND_GRP_NM                /*브랜드그룹명*/
+		     , A.DISTRIBUTION_GB             /*유통구분*/
+		     , A.SUPPLY_COMP_CD              /*업체코드*/
+		     , B.SUPPLY_COMP_NM              /*업체명*/
+		     , A.DELV_LOC_CD                 /*출고처코드*/
+		     , C.DELV_LOC_NM                 /*출고처명*/
+		     , A.ERP_BRAND_CD                /*ERP브랜드코드*/
+		     , A.SELF_YN                     /*자사여부*/
+		     , A.DELV_FEE                    /*기본배송비*/
+		     , A.MIN_ORD_AMT                 /*무료배송비기준*/
+		     , A.SELL_FEE_RATE               /*판매수수료율*/
+		     , A.USE_YN                      /*사용여부*/
+		     , A.PNT_PRATE10                 /*포인트적립율(PC)*/
+		     , A.PNT_MRATE10                 /*포인트적립율(모바일)*/
+		     , A.PNT_PRATE20                 /*포인트적립율(PC)*/
+		     , A.PNT_MRATE20                 /*포인트적립율(모바일)*/
+		     , A.DISP_ORD                    /*표시순서*/
+		FROM   TB_BRAND A
+		INNER JOIN TB_SUPPLY_COMPANY B ON A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
+		LEFT OUTER JOIN TB_DELIVERY_LOC C ON A.DELV_LOC_CD = C.DELV_LOC_CD
+		WHERE  1 = 1
+		<if test='supplyCompCd != null and supplyCompCd != ""'>
+		AND    A.SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		<if test='distributionGb != null and distributionGb != ""'>
+		AND    A.DISTRIBUTION_GB = #{distributionGb}
+		</if>
+		<if test='erpBrandCd != null and erpBrandCd != ""'>
+		AND    A.ERP_BRAND_CD =  #{erpBrandCd}
+		</if>
+		<if test='brandCd != null and brandCd != ""'>
+		AND    A.BRAND_CD = #{brandCd}
+		</if>
+		<if test='searchTxt != null and searchTxt != ""'>
+		AND    (
+		        A.BRAND_CD LIKE CONCAT('%',#{searchTxt},'%')
+		        OR
+		        A.BRAND_ENM LIKE CONCAT('%',#{searchTxt},'%')
+		        OR
+		        A.BRAND_KNM LIKE CONCAT('%',#{searchTxt},'%')
+		        OR
+		        A.BRAND_GRP_NM LIKE CONCAT('%',#{searchTxt},'%')
+		       )
+		</if>
+		<if test='useYn != null and useYn != ""'>
+		AND    A.USE_YN = #{useYn}
+		</if>
+		ORDER  BY A.SELF_YN DESC, A.SUPPLY_COMP_CD, A.DISP_ORD
+	</select>
+	
+	<!-- 담당MD 목록 -->
+	<select id="getMdList" parameterType="String" resultType="BrandMd">
+		/* TsaBusiness.getMdList */
+		SELECT USER_NO AS MD_NO
+		     , USER_NM AS MD_NM
+		FROM   TB_USER
+		WHERE  ROLE_CD = 'G001_A101' /*MD권한*/
+		<if test="mdNm != null and mdNm != ''">
+		AND    LOWER(USER_NM) LIKE CONCAT('%',LOWER(#{mdNm}),'%')
+		</if>
+		AND    USE_YN  = 'Y'
+		ORDER  BY USER_NM
+	</select>
+	
+	<!-- 브랜드담당MD 목록 -->
+	<select id="getBrandMdList" parameterType="String" resultType="BrandMd">
+		/* TsaBusiness.getBrandMdList */
+		SELECT A.FORMAL_GB           /*정상이월구분*/
+		     , A.MD_NO               /*담당MD번호*/
+		     , B.USER_NM    AS MD_NM /*담당MD명*/
+		FROM   TB_BRAND_MD A
+		     , TB_USER B
+		WHERE  A.MD_NO = B.USER_NO
+		AND    A.BRAND_CD = #{brandCd}
+	</select>
+	
+	<!-- 브랜드담당MD 삭제 -->
+	<delete id="deleteBrandMd" parameterType="String">
+		/* TsaBusiness.deleteBrandMd */
+		DELETE
+		FROM   TB_BRAND_MD
+		WHERE  BRAND_CD = #{brandCd}
+	</delete>
+
+	<!-- 브랜드담당MD 등록 -->
+	<insert id="createBrandMd" parameterType="BrandMd">
+		/* TsaBusiness.createBrandMd */
+		INSERT INTO TB_BRAND_MD (
+		       BRAND_CD
+		     , FORMAL_GB
+		     , MD_NO
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT #{brandCd}  AS BRAND_CD
+		     , CD          AS FORMAL_GB
+		     , #{mdNo}     AS MD_NO
+		     , #{regNo}    AS REG_NO
+		     , NOW()       AS REG_DT
+		     , #{updNo}    AS UPD_NO
+		     , NOW()       AS UPD_DT
+		FROM   TB_COMMON_CODE
+		WHERE  CD_GB = 'G009' /*정상이월구분*/
+		AND    CD IN ('G009_10','G009_20') /*정상,이월*/
+		AND    USE_YN = 'Y'
+	</insert>
+	
+	<!-- 브랜드 노출사이트 목록 -->
+	<select id="getBrandSiteList" parameterType="String" resultType="SiteBrand">
+		/* TsaBusiness.getBrandSiteList */
+		SELECT BRAND_CD
+		     , SITE_CD
+		     , DISP_ORD
+		     , USE_YN
+		     , CATE1_NO
+		FROM   TB_SITE_BRAND
+		WHERE  BRAND_CD = #{brandCd}
+		AND    USE_YN ='Y'
+	</select>
+	
+	<!-- 브랜드 노출사이트 등록/수정 -->
+	<insert id="saveBrandSite" parameterType="SiteBrand">
+		/* TsaBusiness.saveBrandSite */
+		INSERT INTO TB_SITE_BRAND (
+		       SITE_CD
+		     , BRAND_CD
+		     , DISP_ORD
+		     , USE_YN
+		     , CATE1_NO
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{siteCd}
+		     , #{brandCd}
+		     , #{dispOrd}
+		     , #{useYn}
+		     , #{cate1No}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 브랜드 등록 -->
+	<insert id="createBrand" parameterType="Brand">
+		/* TsaBusiness.createBrand */
+		INSERT INTO TB_BRAND (
+		       BRAND_CD
+		     , BRAND_ENM
+		     , BRAND_KNM
+		     , BRAND_GRP_NM
+		     , SUPPLY_COMP_CD
+		     , DISTRIBUTION_GB
+		     , SELF_YN
+		     , ERP_BRAND_CD
+		     , MIN_ORD_AMT
+		     , DELV_FEE
+		     , DELV_LOC_CD
+		     , SELL_FEE_RATE
+		     , PNT_PRATE10
+		     , PNT_MRATE10
+		     , PNT_PRATE20
+		     , PNT_MRATE20
+		     , DISP_ORD
+		     , USE_YN
+		     , DISP_ORD
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       (SELECT CONCAT(#{brandGb},IFNULL(LPAD(CAST(SUBSTRING(MAX(BRAND_CD),2) AS UNSIGNED) + 1,3,'0'),'000'))
+		        FROM   TB_BRAND Z
+		        WHERE  BRAND_CD LIKE CONCAT(#{brandGb},'%')
+		       )
+		     , #{brandEnm}
+		     , #{brandKnm}
+		     , #{brandGrpNm}
+		     , #{supplyCompCd}
+		     , #{distributionGb}
+		     , CASE WHEN #{distributionGb} IN ('G065_10','G065_11','G065_12') THEN 'Y'
+		            ELSE 'N'
+		       END
+		     , #{erpBrandCd}
+		     , IFNULL(#{minOrdAmt},0)
+		     , IFNULL(#{delvFee},0)
+		     , #{delvLocCd}
+		     , IFNULL(#{sellFeeRate},0)
+		     , IFNULL(#{pntPrate10},0)
+		     , IFNULL(#{pntMrate10},0)
+		     , IFNULL(#{pntPrate20},0)
+		     , IFNULL(#{pntMrate20},0)
+		     , #{dispOrd}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 브랜드 수정 -->
+	<insert id="updateBrand" parameterType="Brand">
+		/* TsaBusiness.updateBrand */
+		UPDATE TB_BRAND
+		SET    BRAND_ENM = #{brandEnm}
+		     , BRAND_KNM = #{brandKnm}
+		     , BRAND_GRP_NM = #{brandGrpNm}
+		     , SUPPLY_COMP_CD = #{supplyCompCd}
+		     , DISTRIBUTION_GB = #{distributionGb}
+		     , SELF_YN = CASE WHEN #{distributionGb} IN ('G065_10','G065_11','G065_12') THEN 'Y'
+		                      ELSE 'N'
+		                 END
+		     , ERP_BRAND_CD = #{erpBrandCd}
+		     , MIN_ORD_AMT = IFNULL(#{minOrdAmt},0)
+		     , DELV_FEE = IFNULL(#{delvFee},0)
+		     , DELV_LOC_CD = #{delvLocCd}
+		     , SELL_FEE_RATE = IFNULL(#{sellFeeRate},0)
+		     , PNT_PRATE10 = IFNULL(#{pntPrate10},0)
+		     , PNT_MRATE10 = IFNULL(#{pntMrate10},0)
+		     , PNT_PRATE20 = IFNULL(#{pntPrate20},0)
+		     , PNT_MRATE20 = IFNULL(#{pntMrate20},0)
+		     , DISP_ORD = #{dispOrd}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  BRAND_CD = #{brandCd}
+	</insert>
+	
+	<!-- 재고연계관리 - 출고처 목록 -->
+	<select id="getStockSyncDeliveryLocList" parameterType="DeliveryLoc" resultType="DeliveryLoc">
+		/* TsaBusiness.getStockSyncDeliveryLocList */
+		SELECT SUPPLY_COMP_CD
+		     , DELV_LOC_CD
+		     , DELV_LOC_NM
+		     , DELV_LOC_CLSF
+		     , FN_GET_CODE_NM('G024',DELV_LOC_CLSF) AS DELV_LOC_CLSF_NM
+		FROM   TB_DELIVERY_LOC
+		WHERE  SUPPLY_COMP_CD = #{supplyCompCd}
+		AND    DELV_LOC_CLSF IN ('G024_10','G024_21') /*물류창고,직송매장*/
+		<if test="delvLocClsf != null and delvLocClsf != ''">
+		AND    DELV_LOC_CLSF = #{delvLocClsf}
+		</if>
+		<if test="searchTxt != null and searchTxt != ''">
+		    <if test="searchGb == 'CODE'">
+		AND    DELV_LOC_CD = #{delvLocCd}
+		    </if>
+		    <if test="searchGb == 'NAME'">
+		AND    DELV_LOC_NM like CONCAT('%',#{delvLocNm},'%')
+		    </if>
+		</if>
+		AND    USE_YN = 'Y'
+		ORDER  BY DELV_LOC_NM
+	</select>
+
+	<!-- 재고연계관리 - 재고연계기준 목록 -->
+	<select id="getStockSyncBaseList" parameterType="StockSyncBase" resultType="StockSyncBase">
+		/* TsaBusiness.getStockSyncBaseList */
+		SELECT X.DELV_LOC_CD
+		     , X.BRAND_CD
+		     , X.ERP_BRAND_CD
+		     , X.BRAND_KNM
+		     , X.BRAND_ENM
+		     , IFNULL(Y.STOCK_SYNC_YN,'N') AS PREV_STOCK_SYNC_YN /*이전재고연계여부*/
+		     , IFNULL(Y.STOCK_SYNC_YN,'N') AS STOCK_SYNC_YN      /*재고연계여부*/
+		     , IFNULL(Y.DELV_SYNC_YN,'N')  AS PREV_DELV_SYNC_YN  /*이전출고연계여부*/
+		     , IFNULL(Y.DELV_SYNC_YN,'N')  AS DELV_SYNC_YN       /*출고연계여부*/
+		FROM   (
+		        SELECT A.DELV_LOC_CD
+		             , B.BRAND_CD
+		             , B.ERP_BRAND_CD
+		             , B.BRAND_KNM
+		             , B.BRAND_ENM
+		        FROM   TB_DELIVERY_LOC A
+		             , TB_BRAND B
+		        WHERE  A.SUPPLY_COMP_CD = B.SUPPLY_COMP_CD
+		        AND    A.SUPPLY_COMP_CD = #{supplyCompCd}
+		        AND    A.DELV_LOC_CD = #{delvLocCd}
+		        AND    A.USE_YN = 'Y'
+		       ) X
+		LEFT OUTER JOIN TB_STOCK_SYNC_BASE Y ON X.DELV_LOC_CD = Y.DELV_LOC_CD
+		                                    AND X.BRAND_CD = Y.BRAND_CD
+		ORDER BY X.DELV_LOC_CD, X.BRAND_CD
+	</select>
+
+	<!-- 재고연계관리 - 재고연계기준 저장 -->
+	<insert id="saveStockSyncBase" parameterType="StockSyncBase">
+		/* TsaBusiness.saveStockSyncBase */
+		INSERT INTO TB_STOCK_SYNC_BASE (
+		       DELV_LOC_CD
+		     , BRAND_CD
+		     , FORMAL_GB
+		     , STOCK_SYNC_YN
+		     , DELV_SYNC_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{delvLocCd}
+		     , #{brandCd}
+		     , IFNULL(#{formalGb},'G009_10')
+		     , #{stockSyncYn}
+		     , #{delvSyncYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       STOCK_SYNC_YN = #{stockSyncYn}
+		     , DELV_SYNC_YN = #{delvSyncYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+
+	<!-- 판매매장 목록  -->
+	<select id="getSellStoreList" parameterType="SellStore" resultType="SellStore">
+		/* TsaBusiness.getSellStoreList */
+		SELECT SELL_STORE_CD
+		     , SELL_STORE_NM
+		     , USE_YN
+		FROM   TB_SELL_STORE
+		WHERE  1 = 1
+		<if test="sellStoreNm != null and sellStoreNm != ''">
+		AND    LOWER(SELL_STORE_NM) LIKE CONCAT('%',LOWER(#{sellStoreNm}),'%')
+		</if>
+		<if test="useYn != null and useYn != ''">
+		AND    USE_YN = #{useYn}
+		</if>
+		ORDER  BY SELL_STORE_NM
+	</select>
+
+	<!-- 판매매장 등록/수정 -->
+	<insert id="saveSellStore" parameterType="SellStore">
+		/* TsaBusiness.saveSellStore */
+		INSERT INTO TB_SELL_STORE (
+		       SUPPLY_COMP_CD
+		     , SELL_STORE_CD
+		     , SELL_STORE_NM
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{supplyCompCd}
+		     , #{sellStoreCd}
+		     , #{sellStoreNm}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       SELL_STORE_CD = #{sellStoreCd}
+		     , SELL_STORE_NM = #{sellStoreNm}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 제휴링크 목록 -->
+	<select id="getAflinkList" parameterType="Aflink" resultType="Aflink">
+		/*  TsaBusiness.getAflinkList */
+		SELECT AF_LINK_CD
+		     , AF_LINK_NM
+		     , AF_CHANNEL
+		     , DISP_ORD
+		     , USE_YN
+		FROM   TB_AF_LINK
+		WHERE  1 = 1
+		<if test="afChannel != null and afChannel != ''">
+		AND    AF_CHANNEL = #{afChannel}
+		</if>
+	</select>
+
+	<!-- 제휴링크 저장 -->
+	<insert id="saveAflink" parameterType="Aflink">
+		/* TsaBusiness.saveAflink */
+		INSERT INTO TB_AF_LINK (
+		       AF_LINK_CD
+		     , AF_LINK_NM
+		     , AF_CHANNEL
+		     , DISP_ORD
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{afLinkCd}
+		     , #{afLinkNm}
+		     , #{afChannel}
+		     , #{dispOrd}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       AF_LINK_NM = #{afLinkNm}
+		     , AF_CHANNEL = #{afChannel}
+		     , DISP_ORD = #{dispOrd}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+
+	<!-- 제휴링크 삭제 -->
+	<update id="deleteAflink" parameterType="Aflink">
+		/* TsaBusiness.deleteAflink */
+		UPDATE TB_AF_LINK
+		SET    USE_YN = 'N'
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  AF_LINK_CD = #{afLinkCd}
+	</update>
+	
+	<!-- 배송업체관리 목록 -->
+	<select id="getShipCompanyList" resultType="ShipCompany">
+		/* TsaBusiness.getShipCompanyList */
+		SELECT SHIP_COMP_CD
+		     , SHIP_COMP_NM
+		     , TRACKING_URL
+		     , USE_YN
+		FROM   TB_SHIP_COMPANY
+		ORDER  BY SHIP_COMP_CD
+	</select>
+
+	<!-- 배송업체관리 저장 -->
+	<insert id="saveShipCompany" parameterType="ShipCompany">
+		/* TsaBusiness.saveShipCompany */
+		INSERT INTO TB_SHIP_COMPANY (
+		       SHIP_COMP_CD
+		     , SHIP_COMP_NM
+		     , TRACKING_URL
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{shipCompCd}
+		     , #{shipCompNm}
+		     , #{trackingUrl}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       SHIP_COMP_NM = #{shipCompNm}
+		     , TRACKING_URL = #{trackingUrl}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 배송업체관리 삭제 -->
+	<update id="deleteShipCompany" parameterType="ShipCompany">
+		/* TsaBusiness.updateShipCompany */
+		UPDATE TB_SHIP_COMPANY
+		SET    USE_YN = 'N'
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  SHIP_COMP_CD=  #{shipCompCd}
+	</update>
+	
 </mapper>

+ 90 - 90
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaClause.xml

@@ -1,91 +1,91 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaClauseDao">
-
-	<!-- 약관 목록 조회 -->
-	<select id="getClauseList" parameterType="Clause" resultType="Clause">
-		/* TsaClasue.getClauseList */
-		SELECT CLAUSE_SQ
-		     , SITE_CD
-		     , CLAUSE_TYPE
-		     , CLAUSE_TITLE
-		     , CLAUSE_CONTENT
-		     , DATE_FORMAT(EFFECT_DT,'%Y%m%d')    AS EFFECT_DT
-		     , DISP_YN
-		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
-		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		     , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
-		     , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		FROM   TB_CLAUSE
-		WHERE  SITE_CD = #{siteCd}
-		<if test="clauseType != null and clauseType != ''">
-		AND    CLAUSE_TYPE = #{clauseType}
-		</if>
-		ORDER  BY CLAUSE_TYPE
-	</select>
-	
-	<!-- 약관 상세 조회 -->
-	<select id="getClauseDetail" parameterType="Integer" resultType="Clause">
-		/* TsaClause.getClauseDetail */
-		SELECT CLAUSE_SQ
-		     , SITE_CD
-		     , CLAUSE_TYPE
-		     , CLAUSE_TITLE
-		     , CLAUSE_CONTENT
-		     , DATE_FORMAT(EFFECT_DT,'%Y%m%d')    AS EFFECT_DT
-		     , DISP_YN
-		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
-		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		     , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
-		     , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		FROM   TB_CLAUSE
-		WHERE  CLAUSE_SQ = #{clauseSq}
-	</select>
-
-	<!-- 약관 생성 -->
-	<insert id="createClause" parameterType="Clause">
-		/* TsaClasue.createClause */
-		INSERT INTO TB_CLAUSE (
-		       CLAUSE_SQ
-		     , SITE_CD
-		     , CLAUSE_TYPE
-		     , CLAUSE_TITLE
-		     , CLAUSE_CONTENT
-		     , EFFECT_DT
-		     , DISP_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       NULL
-		     , #{siteCd}
-		     , #{clauseType}
-		     , #{clauseTitle}
-		     , #{clauseContent}
-		     , STR_TO_DATE(#{effectDt},'%Y-%m-%d')
-		     , #{dispYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-	</insert>
-
-	<!-- 약관 수정 -->
-	<update id="updateClause" parameterType="Clause">
-		/* TsaClasue.updateClause */
-		UPDATE TB_CLAUSE
-		SET    SITE_CD = #{siteCd}
-		     , CLAUSE_TYPE = #{clauseType}
-		     , CLAUSE_TITLE = #{clauseTitle}
-		     , CLAUSE_CONTENT = #{clauseContent}
-		     , EFFECT_DT = STR_TO_DATE(#{effectDt},'%Y-%m-%d')
-		     , DISP_YN = #{dispYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  CLAUSE_SQ = #{clauseSq}
-	</update>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaClauseDao">
+
+	<!-- 약관 목록 조회 -->
+	<select id="getClauseList" parameterType="Clause" resultType="Clause">
+		/* TsaClasue.getClauseList */
+		SELECT CLAUSE_SQ
+		     , SITE_CD
+		     , CLAUSE_TYPE
+		     , CLAUSE_TITLE
+		     , CLAUSE_CONTENT
+		     , DATE_FORMAT(EFFECT_DT,'%Y%m%d')    AS EFFECT_DT
+		     , DISP_YN
+		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
+		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
+		     , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		FROM   TB_CLAUSE
+		WHERE  SITE_CD = #{siteCd}
+		<if test="clauseType != null and clauseType != ''">
+		AND    CLAUSE_TYPE = #{clauseType}
+		</if>
+		ORDER  BY CLAUSE_TYPE
+	</select>
+	
+	<!-- 약관 상세 조회 -->
+	<select id="getClauseDetail" parameterType="Integer" resultType="Clause">
+		/* TsaClause.getClauseDetail */
+		SELECT CLAUSE_SQ
+		     , SITE_CD
+		     , CLAUSE_TYPE
+		     , CLAUSE_TITLE
+		     , CLAUSE_CONTENT
+		     , DATE_FORMAT(EFFECT_DT,'%Y%m%d')    AS EFFECT_DT
+		     , DISP_YN
+		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
+		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
+		     , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		FROM   TB_CLAUSE
+		WHERE  CLAUSE_SQ = #{clauseSq}
+	</select>
+
+	<!-- 약관 생성 -->
+	<insert id="createClause" parameterType="Clause">
+		/* TsaClasue.createClause */
+		INSERT INTO TB_CLAUSE (
+		       CLAUSE_SQ
+		     , SITE_CD
+		     , CLAUSE_TYPE
+		     , CLAUSE_TITLE
+		     , CLAUSE_CONTENT
+		     , EFFECT_DT
+		     , DISP_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       NULL
+		     , #{siteCd}
+		     , #{clauseType}
+		     , #{clauseTitle}
+		     , #{clauseContent}
+		     , STR_TO_DATE(#{effectDt},'%Y-%m-%d')
+		     , #{dispYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 약관 수정 -->
+	<update id="updateClause" parameterType="Clause">
+		/* TsaClasue.updateClause */
+		UPDATE TB_CLAUSE
+		SET    SITE_CD = #{siteCd}
+		     , CLAUSE_TYPE = #{clauseType}
+		     , CLAUSE_TITLE = #{clauseTitle}
+		     , CLAUSE_CONTENT = #{clauseContent}
+		     , EFFECT_DT = STR_TO_DATE(#{effectDt},'%Y-%m-%d')
+		     , DISP_YN = #{dispYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  CLAUSE_SQ = #{clauseSq}
+	</update>
+
 </mapper>

+ 64 - 64
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaCommon.xml

@@ -1,65 +1,65 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaCommonDao">
-
-	<!-- 엑셀조회를 위한 SEARCH 테이블 삭제  -->
-	<delete id="deleteExceluploadSearCh" parameterType="SearchData">
-		/* TsaCommon.deleteExceluploadSearCh */
-		DELETE
-		FROM   TB_SEARCH_DATA
-		WHERE  REG_NO = #{regNo}
-	</delete>
-
-	<!-- 엑셀조회를 위한 SEARCH 테이블  생성 -->
-	<insert id="createExceluploadSearch" parameterType="SearchData">
-		/* TsaCommon.createExceluploadSearch */
-		INSERT INTO TB_SEARCH_DATA (
-		        REG_NO
-		      , SEARCH_CD
-		      , DISP_ORD
-		 )
-		 SELECT #{regNo}
-		      , #{searchCd}
-		      , (SELECT COUNT(*) + 100
-		         FROM   TB_SEARCH_DATA
-		         WHERE  REG_NO = #{regNo})
-		 FROM   DUAL
-		 WHERE  (SELECT COUNT(*) FROM TB_SEARCH_DATA WHERE SEARCH_CD = #{searchCd} AND REG_NO = #{regNo}) = 0
-	</insert>
-	
-	<!-- 엑셀조회를 위한 SEARCH 테이블  생성 - dummy 컬럼 포함 -->
-	<insert id="createExceluploadSearchByAll" parameterType="SearchData">
-		/* TsaCommon.createExceluploadSearchByAll */
-		INSERT INTO TB_SEARCH_DATA (
-		        REG_NO
-		      , SEARCH_CD
-		      , DISP_ORD
-		      , DUMMY1
-		      , DUMMY2
-		      , DUMMY3
-		 )
-		 SELECT #{regNo}
-		      , #{searchCd}
-		      , (SELECT COUNT(*) + 100
-		         FROM   TB_SEARCH_DATA
-		         WHERE  REG_NO = #{regNo})
-		      , #{dummy1}
-		      , #{dummy2}
-		      , #{dummy3}
-		 FROM   DUAL
-		 WHERE  (SELECT COUNT(*) FROM TB_SEARCH_DATA
-		         WHERE SEARCH_CD = #{searchCd}
-		         AND DUMMY1 = #{dummy1}
-		         AND DUMMY2 = #{dummy2}
-		         AND DUMMY3 = #{dummy3}
-		         AND REG_NO = #{regNo}) = 0
-	</insert>
-	
-	<!-- 샘플파일 시스템파일명 조회 -->
-	<select id="getSampleFileSystemFilename" parameterType="String" resultType="String">
-		/* TsaCommon.getSampleFileSystemFilename */
-		SELECT SYS_FILE_NM
-		FROM   TB_SAMPLE_FILE
-		WHERE  SAMPLE_FILE_ID = #{sampleFileId}
-	</select>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaCommonDao">
+
+	<!-- 엑셀조회를 위한 SEARCH 테이블 삭제  -->
+	<delete id="deleteExceluploadSearCh" parameterType="SearchData">
+		/* TsaCommon.deleteExceluploadSearCh */
+		DELETE
+		FROM   TB_SEARCH_DATA
+		WHERE  REG_NO = #{regNo}
+	</delete>
+
+	<!-- 엑셀조회를 위한 SEARCH 테이블  생성 -->
+	<insert id="createExceluploadSearch" parameterType="SearchData">
+		/* TsaCommon.createExceluploadSearch */
+		INSERT INTO TB_SEARCH_DATA (
+		        REG_NO
+		      , SEARCH_CD
+		      , DISP_ORD
+		 )
+		 SELECT #{regNo}
+		      , #{searchCd}
+		      , (SELECT COUNT(*) + 100
+		         FROM   TB_SEARCH_DATA
+		         WHERE  REG_NO = #{regNo})
+		 FROM   DUAL
+		 WHERE  (SELECT COUNT(*) FROM TB_SEARCH_DATA WHERE SEARCH_CD = #{searchCd} AND REG_NO = #{regNo}) = 0
+	</insert>
+	
+	<!-- 엑셀조회를 위한 SEARCH 테이블  생성 - dummy 컬럼 포함 -->
+	<insert id="createExceluploadSearchByAll" parameterType="SearchData">
+		/* TsaCommon.createExceluploadSearchByAll */
+		INSERT INTO TB_SEARCH_DATA (
+		        REG_NO
+		      , SEARCH_CD
+		      , DISP_ORD
+		      , DUMMY1
+		      , DUMMY2
+		      , DUMMY3
+		 )
+		 SELECT #{regNo}
+		      , #{searchCd}
+		      , (SELECT COUNT(*) + 100
+		         FROM   TB_SEARCH_DATA
+		         WHERE  REG_NO = #{regNo})
+		      , #{dummy1}
+		      , #{dummy2}
+		      , #{dummy3}
+		 FROM   DUAL
+		 WHERE  (SELECT COUNT(*) FROM TB_SEARCH_DATA
+		         WHERE SEARCH_CD = #{searchCd}
+		         AND DUMMY1 = #{dummy1}
+		         AND DUMMY2 = #{dummy2}
+		         AND DUMMY3 = #{dummy3}
+		         AND REG_NO = #{regNo}) = 0
+	</insert>
+	
+	<!-- 샘플파일 시스템파일명 조회 -->
+	<select id="getSampleFileSystemFilename" parameterType="String" resultType="String">
+		/* TsaCommon.getSampleFileSystemFilename */
+		SELECT SYS_FILE_NM
+		FROM   TB_SAMPLE_FILE
+		WHERE  SAMPLE_FILE_ID = #{sampleFileId}
+	</select>
 </mapper>

+ 63 - 63
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaEnvset.xml

@@ -1,64 +1,64 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaEnvsetDao">
-
-	<!-- 환경설정 생성 -->
-	<insert id="createEnvset" parameterType="Envset">
-		/* TsaEnvset.createEnvset */
-		INSERT INTO TB_ENVSET (
-		       ENVSET_SQ
-		     , SITE_CD
-		     , ENVSET_TYPE
-		     , ENVSET_NM
-		     , STR_SET_VAL1
-		     , STR_SET_VAL2
-		     , STR_SET_VAL3
-		     , STR_SET_VAL4
-		     , STR_SET_VAL5
-		     , STR_SET_VAL6
-		     , STR_SET_VAL7
-		     , STR_SET_VAL8
-		     , REG_NO
-		     , REG_DT
-		)
-		VALUES (
-		       NULL
-		     , #{siteCd}
-		     , #{envsetType}
-		     , #{envsetNm}
-		     , #{strSetVal1}
-		     , #{strSetVal2}
-		     , #{strSetVal3}
-		     , #{strSetVal4}
-		     , #{strSetVal5}
-		     , #{strSetVal6}
-		     , #{strSetVal7}
-		     , #{strSetVal8}
-		     , #{regNo}
-		     , NOW()
-		)
-	</insert>
-
-	<!-- 환경설정 목록 -->
-	<select id="getEnvsetList" parameterType="Envset" resultType="Envset">
-		/* TsaEnvset.getEnvsetList */
-		SELECT SITE_CD
-		     , ENVSET_TYPE
-		     , ENVSET_NM
-		     , STR_SET_VAL1
-		     , STR_SET_VAL2
-		     , STR_SET_VAL3
-		     , STR_SET_VAL4
-		     , STR_SET_VAL5
-		     , STR_SET_VAL6
-		     , STR_SET_VAL7
-		     , STR_SET_VAL8
-		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
-		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		FROM   TB_ENVSET
-		WHERE  SITE_CD = #{siteCd}
-		AND    ENVSET_TYPE = #{envsetType}
-		ORDER  BY ENVSET_SQ DESC
-	</select>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaEnvsetDao">
+
+	<!-- 환경설정 생성 -->
+	<insert id="createEnvset" parameterType="Envset">
+		/* TsaEnvset.createEnvset */
+		INSERT INTO TB_ENVSET (
+		       ENVSET_SQ
+		     , SITE_CD
+		     , ENVSET_TYPE
+		     , ENVSET_NM
+		     , STR_SET_VAL1
+		     , STR_SET_VAL2
+		     , STR_SET_VAL3
+		     , STR_SET_VAL4
+		     , STR_SET_VAL5
+		     , STR_SET_VAL6
+		     , STR_SET_VAL7
+		     , STR_SET_VAL8
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       NULL
+		     , #{siteCd}
+		     , #{envsetType}
+		     , #{envsetNm}
+		     , #{strSetVal1}
+		     , #{strSetVal2}
+		     , #{strSetVal3}
+		     , #{strSetVal4}
+		     , #{strSetVal5}
+		     , #{strSetVal6}
+		     , #{strSetVal7}
+		     , #{strSetVal8}
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 환경설정 목록 -->
+	<select id="getEnvsetList" parameterType="Envset" resultType="Envset">
+		/* TsaEnvset.getEnvsetList */
+		SELECT SITE_CD
+		     , ENVSET_TYPE
+		     , ENVSET_NM
+		     , STR_SET_VAL1
+		     , STR_SET_VAL2
+		     , STR_SET_VAL3
+		     , STR_SET_VAL4
+		     , STR_SET_VAL5
+		     , STR_SET_VAL6
+		     , STR_SET_VAL7
+		     , STR_SET_VAL8
+		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
+		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		FROM   TB_ENVSET
+		WHERE  SITE_CD = #{siteCd}
+		AND    ENVSET_TYPE = #{envsetType}
+		ORDER  BY ENVSET_SQ DESC
+	</select>
+
 </mapper>

+ 89 - 89
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaFaq.xml

@@ -1,90 +1,90 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaFaqDao">
-
-	<!-- FAQ 목록 -->
-	<select id="getFaqList" parameterType="Faq" resultType="Faq">
-		/* TsaFaq.getFaqList */
-		SELECT FAQ_SQ                                       /*FAQ일련번호(SEQ_FAQ sequence)*/
-		     , SITE_CD                                      /*사이트코드(공통코드G000)*/
-		     , FAQ_TYPE                                     /*FAQ유형(공통코드G046)*/
-		     , QUESTION                                     /*질문*/
-		     , ANSWER                                       /*답변*/
-		     , USE_YN                                       /*사용여부(Y:사용)*/
-		     , READ_CNT                                     /*조회수*/
-		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
-		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		     , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
-		     , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		FROM   TB_FAQ
-		WHERE  SITE_CD = #{siteCd}
-		<if test='faqType != null and faqType !=""'>
-		AND    FAQ_TYPE = #{faqType}
-		</if>
-		<if test='useYn != null and useYn !=""'>
-		AND    USE_YN = #{useYn}
-		</if>
-		<if test="searchTxt != null and searchTxt !=''">
-		AND    (
-		        LOWER(QUESTION) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
-		        OR
-		        LOWER(ANSWER) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
-		       )
-		</if>
-	</select>
-
-	<!-- FAQ 등록/수정 -->
-	<insert id="saveFaq" parameterType="Faq">
-		/* TsaFaq.saveFaq */
-		INSERT INTO TB_FAQ (
-		       FAQ_SQ
-		     , SITE_CD
-		     , FAQ_TYPE
-		     , QUESTION
-		     , ANSWER
-		     , USE_YN
-		     , READ_CNT
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{faqSq}
-		     , #{siteCd}
-		     , #{faqType}
-		     , #{question}
-		     , #{answer}
-		     , #{useYn}
-		     , 0
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       SITE_CD = #{siteCd}
-		     , FAQ_TYPE = #{faqType}
-		     , QUESTION = #{question}
-		     , ANSWER = #{answer}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-
-	<!-- FAQ 상세 -->
-	<select id="getFaq" parameterType="Integer" resultType="Faq">
-		/* TsaFaq.getFaq */
-		SELECT FAQ_SQ                                    /*FAQ일련번호*/
-		     , SITE_CD                                   /*사이트코드*/
-		     , FN_GET_CODE_NM('G000',SITE_CD) AS SITE_NM /*사이트명*/
-		     , FAQ_TYPE                                  /*유형*/
-		     , QUESTION                                  /*질문*/
-		     , ANSWER                                    /*답변*/
-		     , USE_YN                                    /*사용여부*/
-		     , READ_CNT                                  /*조회수*/
-		FROM   TB_FAQ
-		WHERE  FAQ_SQ = #{faqSq}
-	</select>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaFaqDao">
+
+	<!-- FAQ 목록 -->
+	<select id="getFaqList" parameterType="Faq" resultType="Faq">
+		/* TsaFaq.getFaqList */
+		SELECT FAQ_SQ                                       /*FAQ일련번호(SEQ_FAQ sequence)*/
+		     , SITE_CD                                      /*사이트코드(공통코드G000)*/
+		     , FAQ_TYPE                                     /*FAQ유형(공통코드G046)*/
+		     , QUESTION                                     /*질문*/
+		     , ANSWER                                       /*답변*/
+		     , USE_YN                                       /*사용여부(Y:사용)*/
+		     , READ_CNT                                     /*조회수*/
+		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
+		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
+		     , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		FROM   TB_FAQ
+		WHERE  SITE_CD = #{siteCd}
+		<if test='faqType != null and faqType !=""'>
+		AND    FAQ_TYPE = #{faqType}
+		</if>
+		<if test='useYn != null and useYn !=""'>
+		AND    USE_YN = #{useYn}
+		</if>
+		<if test="searchTxt != null and searchTxt !=''">
+		AND    (
+		        LOWER(QUESTION) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		        OR
+		        LOWER(ANSWER) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		       )
+		</if>
+	</select>
+
+	<!-- FAQ 등록/수정 -->
+	<insert id="saveFaq" parameterType="Faq">
+		/* TsaFaq.saveFaq */
+		INSERT INTO TB_FAQ (
+		       FAQ_SQ
+		     , SITE_CD
+		     , FAQ_TYPE
+		     , QUESTION
+		     , ANSWER
+		     , USE_YN
+		     , READ_CNT
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{faqSq}
+		     , #{siteCd}
+		     , #{faqType}
+		     , #{question}
+		     , #{answer}
+		     , #{useYn}
+		     , 0
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       SITE_CD = #{siteCd}
+		     , FAQ_TYPE = #{faqType}
+		     , QUESTION = #{question}
+		     , ANSWER = #{answer}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+
+	<!-- FAQ 상세 -->
+	<select id="getFaq" parameterType="Integer" resultType="Faq">
+		/* TsaFaq.getFaq */
+		SELECT FAQ_SQ                                    /*FAQ일련번호*/
+		     , SITE_CD                                   /*사이트코드*/
+		     , FN_GET_CODE_NM('G000',SITE_CD) AS SITE_NM /*사이트명*/
+		     , FAQ_TYPE                                  /*유형*/
+		     , QUESTION                                  /*질문*/
+		     , ANSWER                                    /*답변*/
+		     , USE_YN                                    /*사용여부*/
+		     , READ_CNT                                  /*조회수*/
+		FROM   TB_FAQ
+		WHERE  FAQ_SQ = #{faqSq}
+	</select>
+
 </mapper>

+ 2080 - 2080
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml

@@ -1,2081 +1,2081 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaGoodsDao">
-
-	<!-- 품목 목록 -->
-	<select id="getItemkindList" parameterType="Itemkind" resultType="Itemkind">
-		/* TsaGoods.getItemkindList */
-		SELECT ITEMKIND_CD
-		     , ITEMKIND_NM
-		     /* , ITEMKIND_ENM*/
-		     , NI_CLSF_CD
-		     , USE_YN
-		FROM TB_ITEMKIND
-		WHERE 1 = 1
-		<if test="itemkindCd != null and itemkindCd != ''">
-		AND ITEMKIND_CD = #{itemkindCd} 
-		</if>
-		<if test="useYn != null and useYn != ''">
-		AND USE_YN = #{useYn} 
-		</if>
-		ORDER BY ITEMKIND_CD
-	</select>
-
-	<!-- 품목 등록/저장 -->
-	<insert id="saveItemkindInfo" parameterType="Itemkind">
-		/* TsaGoods.saveItemkindInfo */
-		INSERT INTO TB_ITEMKIND (
-		       ITEMKIND_CD
-		     , ITEMKIND_NM
-		     , NI_CLSF_CD
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{itemkindCd}
-		     , #{itemkindNm}
-		     , #{niClsfCd}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       ITEMKIND_NM = #{itemkindNm}
-		     , NI_CLSF_CD = #{niClsfCd}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
-	<!-- 품목 삭제 -->
-	<delete id="deleteItemkindInfo" parameterType="Itemkind">
-		/* TsaGoods.deleteItemkindInfo */
-		DELETE FROM TB_ITEMKIND
-		 WHERE ITEMKIND_CD = #{itemkindCd}
-	</delete>
-	
-	<!-- 색상 조회 -->
-	<select id="getColorList" parameterType="Color" resultType="Color" >
-		/* TsaGoods.getColorList */
-		SELECT COLOR_CD
-		     , COLOR_ENM
-		     , COLOR_KNM
-		     , COLOR_FILE
-		     , COLOR_GRP_NM
-		     , USE_YN
-		     , FN_GET_USER_NM(REG_NO) AS REG_NM
-		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
-		     , FN_GET_USER_NM(UPD_NO) AS UPD_NM
-		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
-		     , COLOR_GRP_CD
-		FROM TB_COLOR
-		WHERE 1 = 1
-		<if test='colorCd != null and colorCd != ""'>
-		AND COLOR_CD = #{colorCd}
-		</if>
-		<if test='useYn != null and useYn != ""'>
-		AND USE_YN = #{useYn}
-		</if>
-		ORDER BY COLOR_CD
-	</select>
-	
-	<!-- 색상 저장 -->
-	<update id="saveColor" parameterType="Color">
-		/* TsaGoods.saveColor */
-		INSERT INTO TB_COLOR (
-		       COLOR_CD
-		     , COLOR_ENM
-		     , COLOR_KNM
-		     , COLOR_FILE
-		     , COLOR_GRP_NM
-		     , COLOR_GRP_CD
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{colorCd}
-		     , #{colorEnm}
-		     , #{colorKnm}
-		     , #{colorFile}
-		     , #{colorGrpNm}
-		     , #{colorGrpCd}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       COLOR_ENM = #{colorEnm}
-		     , COLOR_KNM = #{colorKnm}
-		     , COLOR_FILE = UPPER(#{colorFile})
-		     , COLOR_GRP_NM = UPPER(#{colorGrpNm})
-		     , COLOR_GRP_CD = UPPER(#{colorGrpCd})
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</update>
-	
-	<!-- 정보고시분류 목록 -->
-	<select id="getNotiInfoList" parameterType="NotiInfo" resultType="NotiInfo">
-		/* TsaGoods.getNotiInfoList */
-		SELECT DISTINCT B.SUPPLY_COMP_CD
-		     , B.NI_CLSF_CD
-		     , C.CD_NM AS NI_CLSF_NM
-		     , C.DISP_ORD
-		FROM TB_NOTI_INFO B
-		INNER JOIN TB_COMMON_CODE C ON B.NI_CLSF_CD = C.CD 
-		WHERE B.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
-		                         WHEN 'S0001' THEN 'S0001'
-		                         WHEN 'S0002' THEN 'S0002'
-		                         ELSE 'E' END 
-		AND C.CD_GB = 'G004'   /*고시정보*/
-		ORDER BY C.DISP_ORD
-	</select>
-	
-	<!-- 정보고시 상세 목록 -->
-	<select id="getNotiInfoItemList" parameterType="NotiInfo" resultType="NotiInfo">
-		/* TsaGoods.getNotiInfoItemList */
-		SELECT B.SUPPLY_COMP_CD
-		     , B.NI_CLSF_CD
-		     , B.NI_ITEM_CD
-		     , FN_GET_CODE_NM('G005', B.NI_ITEM_CD) AS NI_ITEM_NM
-		     , B.NI_CONTENT
-		     , B.DISP_ORD
-		     , B.REQ_YN
-		     , B.DISP_YN
-		FROM TB_NOTI_INFO B
-		WHERE B.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
-		                         WHEN 'S0001' THEN 'S0001'
-		                         WHEN 'S0002' THEN 'S0002'
-		                         ELSE 'E' END 
-		<if test="niClsfCd != null and niClsfCd != ''">
-		AND B.NI_CLSF_CD = #{niClsfCd}
-		</if>
-		ORDER BY B.NI_CLSF_CD, B.DISP_ORD
-	</select>
-
-	<!-- 정보고시 항목 등록 -->
-	<insert id="saveNotiInfo" parameterType="NotiInfo">
-		/* TsaGoods.saveNotiInfo */
-		INSERT INTO TB_NOTI_INFO (
-		       SUPPLY_COMP_CD
-		     , NI_CLSF_CD
-		     , NI_ITEM_CD
-		     , NI_CONTENT
-		     , DISP_ORD
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{supplyCompCd}
-		     , #{niClsfCd}
-		     , #{niItemCd}
-		     , #{niContent}
-		     , #{dispOrd}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       NI_CONTENT = #{niContent}
-		     , DISP_ORD = #{dispOrd}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
-	<!-- 상품 목록 건수 -->
-	<select id="getGoodsListCount" parameterType="GoodsSearch" resultType="int">
-		/* TsaGoods.getGoodsListCount */
-		        SELECT COUNT(*) AS TOTCNT
-		        FROM TB_GOODS G
-		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
-		        INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
-		        <if test="searchGb != null and searchGb =='EXTEND'">
-		        INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.EXTEND_GOODS_CD
-		                                      AND GE.GOODS_CD IN
-		            <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
-		                                          UPPER(#{item})
-		            </foreach>
-		        </if>
-		        <if test="searchGb != null and searchGb =='MASTER'">
-		        INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.GOODS_CD
-		                                      AND GE.EXTEND_GOODS_CD IN
-		            <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
-		                                          UPPER(#{item})
-		            </foreach>
-		        </if>
-		        <if test="searchGb != null and searchGb =='EXCEL'">
-		        INNER JOIN (
-		                     SELECT SEARCH_CD
-		                          , TMP_DISP_ORD
-		                     FROM (
-		                           SELECT SEARCH_CD
-		                                , MIN(DISP_ORD) AS TMP_DISP_ORD
-		                           FROM TB_SEARCH_DATA
-		                           WHERE REG_NO = #{regNo}
-		                           GROUP BY SEARCH_CD) T
-		                   ) SD
-		                   ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
-		                        OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
-		                        <if test="mdNo != null and mdNo > 0">
-		                        AND G.BRAND_CD IN (
-		                                           SELECT DISTINCT BRAND_CD
-		                                           FROM TB_BRAND_MD
-		                                           WHERE MD_NO = #{mdNo}
-		                                           )
-		                       </if>
-		                   )
-		        </if>
-		        LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
-		        WHERE 1=1
-		        <if test="searchGb == null or searchGb =='BASIC' or searchGb =='EXTEND' or searchGb =='MASTER'" >
-		        <include refid="getGoodsListCondition_sql"/>
-		        </if>
-	</select>
-
-	<!-- 상품 목록 -->
-	<select id="getGoodsList" parameterType="GoodsSearch" resultType="Goods">
-		/* TsaGoods.getGoodsList */
-		SELECT Z.*
-		    /*, (CASE WHEN Z.GOODS_TYPE = 'N' THEN (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = Z.GOODS_CD) 
-		            ELSE (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_EXTEND WHERE GOODS_CD = Z.GOODS_CD) 
-		            END) AS STOCK_QTY_SUM */
-		    , 0 AS STOCK_QTY_SUM
-		    , (SELECT ITEMKIND_NM FROM TB_ITEMKIND WHERE ITEMKIND_CD = Z.ITEMKIND_CD ) AS ITEMKIND_NM
-		    , FN_GET_USER_NM(REG_NO) AS REG_NM
-		    , FN_GET_USER_NM(UPD_NO) AS UPD_NM
-		FROM (
-		    SELECT A.*, @rownum := @rownum + 1 AS RNUM FROM (
-		        SELECT
-		                G.GOODS_CD
-		              , G.GOODS_TYPE
-		              , B.BRAND_ENM
-		              , B.BRAND_GRP_NM
-		              , G.BRAND_CD
-		              , G.ITEMKIND_CD
-		              , G.SUPPLY_COMP_CD
-		              , G.SUPPLY_GOODS_CD
-		              , G.GOODS_NUM
-		              , G.GOODS_NM
-		              , G.GOODS_STAT
-		              , G.LIST_PRICE
-		              , G.CURR_PRICE
-		              , G.DC_RATE
-		              , G.SELF_GOODS_YN
-		              , G.SELF_MALL_YN
-		              , G.FORMAL_GB
-		              , G.STYLE_YEAR
-		              , G.SEASON_CD
-		              , G.ERP_STOCK_LINK_YN
-		              , G.ERP_PRICE_LINK_YN
-		              , G.CHANGEABLE_YN
-		              , G.RETURNABLE_YN
-		              , DATE_FORMAT(G.FRST_CFRM_DT, '%Y%m%d%H%i%S') AS FRST_CFRM_DT
-		              , G.SELL_FEE_RATE
-		              , DATE_FORMAT(G.PRICE_UPD_DT,'%Y%m%d%H%i%S') AS PRICE_UPD_DT
-		              , CASE WHEN IMG_PATH1 IS NULL THEN
-		                     'N'
-		                ELSE
-		                     'Y'
-		                END AS GOODS_IMAGE_YN
-		              , GI.IMG_PATH1
-		              , GI.IMG_PATH6
-		              , GI.IMG_TYPE
-		              , G.REG_NO
-		              , DATE_FORMAT(G.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		              , G.UPD_NO
-		              , DATE_FORMAT(G.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		              , GS.SELL_DAY15_QTY
-		              <choose>
-		                  <when test="searchGb != null and searchGb =='EXCEL'">
-		              , SD.TMP_DISP_ORD
-		                  </when>
-		                  <otherwise>
-		              , 0 AS TMP_DISP_ORD
-		                  </otherwise>
-		              </choose>
-		        FROM TB_GOODS G
-		        JOIN ( SELECT @rownum := 0) R
-		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
-		        INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
-		        <if test="searchGb != null and searchGb =='EXTEND'">
-		        INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.EXTEND_GOODS_CD
-		                                      AND GE.GOODS_CD IN
-		            <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
-		                                          UPPER(#{item})
-		            </foreach>
-		        </if>
-		        <if test="searchGb != null and searchGb =='MASTER'">
-		        INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.GOODS_CD
-		                                      AND GE.EXTEND_GOODS_CD IN
-		            <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
-		                                          UPPER(#{item})
-		            </foreach>
-		        </if>
-		        <if test="searchGb != null and searchGb =='EXCEL'">
-		        INNER JOIN (
-		                     SELECT SEARCH_CD
-		                          , TMP_DISP_ORD
-		                     FROM (
-		                           SELECT SEARCH_CD
-		                                , MIN(DISP_ORD) AS TMP_DISP_ORD
-		                           FROM TB_SEARCH_DATA
-		                           WHERE REG_NO = #{regNo}
-		                           GROUP BY SEARCH_CD) T
-		                   ) SD
-		                   ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
-		                        OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
-		                        <if test="mdNo != null and mdNo > 0">
-		                        AND G.BRAND_CD IN (
-		                                           SELECT DISTINCT BRAND_CD
-		                                           FROM TB_BRAND_MD
-		                                           WHERE MD_NO = #{mdNo}
-		                                           )
-		                       </if>
-		                   )
-		        </if>
-		        LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
-		        WHERE 1=1
-		        <if test="searchGb == null or searchGb =='BASIC' or searchGb =='EXTEND' or searchGb =='MASTER'" >
-		        <include refid="getGoodsListCondition_sql"/>
-		        ORDER BY G.REG_DT DESC, G.GOODS_CD
-		        </if>
-		        <if test="searchGb != null and searchGb =='EXCEL'">
-		        ORDER BY SD.TMP_DISP_ORD
-		        </if>
-		<include refid="getListPagingCondition_sql"/>
-	</select>
-	
-	<!-- 상품 목록 조건 정보 -->
-	<sql id="getGoodsListCondition_sql">
-		        <if test='conditionList != null and conditionList.length>0'>
-		            <choose>
-		              <when test='search != null and search == "searchGoodsCd"'>
-		        AND (
-		              <foreach collection="conditionList" item="item" index="index" separator="or">
-		               UPPER(G.GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%') 
-		              </foreach>
-		             )
-		              </when>
-		              <when test='search != null and search == "searchGoodsNum"'>
-		        AND (
-		              <foreach collection="conditionList" item="item" index="index" separator="or">
-		               UPPER(G.GOODS_NUM) LIKE CONCAT('%',UPPER(#{item}),'%')
-		              </foreach>
-		             )
-		              </when>
-		              <when test='search != null and search == "searchSupplyGoodsCd"'>
-		        AND (
-		              <foreach collection="conditionList" item="item" index="index" separator="or">
-		               UPPER(G.SUPPLY_GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%')
-		              </foreach>
-		             )
-		              </when>
-		              <when test='search != null and search == "searchExtendGoodsCd"'>
-		        AND 1 = 1
-		              </when>
-		              <when test='search != null and search == "searchMasterGoodsCd"'>
-		        AND 1 = 1
-		              </when>
-		              <otherwise>
-		        AND UPPER(G.REG_ID) LIKE CONCAT('%',UPPER(#{item}),'%')
-		              </otherwise>
-		            </choose>
-		        </if>
-		        <if test="goodsCd != null and goodsCd != ''">
-		        AND UPPER(G.GOODS_CD) LIKE CONCAT('%',UPPER(#{goodsCd}),'%')
-		        </if>
-		         <if test="goodsNm != null and goodsNm != ''">
-		        AND UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{goodsNm}),'%')
-		        </if>
-		        <if test="goodsType != null and goodsType != ''">
-		        AND G.GOODS_TYPE = #{goodsType}
-		        </if>
-		        <if test="supplyCompCd != null and supplyCompCd != ''">
-		        AND G.SUPPLY_COMP_CD = #{supplyCompCd}
-		        </if>
-		        <if test="brandCd != null and brandCd != ''">
-		        AND G.BRAND_CD = #{brandCd}
-		        </if>
-		        <if test="multiBrand != null and multiBrand != ''">
-		        AND G.BRAND_CD IN
-		            <foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
-		        #{item}
-		            </foreach>
-		        </if>
-		        <if test="selfMallYn != null and selfMallYn != ''">
-		        AND G.SELF_MALL_YN = #{selfMallYn}
-		        </if>
-		        <if test="itemkindCd != null and itemkindCd != ''">
-		        AND G.ITEMKIND_CD = #{itemkindCd}
-		        </if>
-		        <if test="multiItemkindCd != null and multiItemkindCd != ''">
-		        AND G.ITEMKIND_CD IN
-		            <foreach collection="multiItemkindCd" item="item" index="index"  open="(" close=")" separator=",">
-		        #{item}
-		            </foreach>
-		        </if>
-		        <if test="goodsStat != null and goodsStat != ''">
-		        AND G.GOODS_STAT = #{goodsStat}
-		        </if>
-		        <if test="multiGoodsStat != null and multiGoodsStat != ''">
-		        AND G.GOODS_STAT IN
-		            <foreach collection="multiGoodsStat" item="item" index="index"  open="(" close=")" separator=",">
-		        #{item}
-		            </foreach>
-		        </if>
-		        <if test="styleYear != null and styleYear != ''">
-		        AND G.STYLE_YEAR = (SELECT CD_NM FROM TB_COMMON_CODE WHERE CD = #{styleYear} AND CD_GB='G023')
-		        </if>
-		        <if test="multiStyleYear != null and multiStyleYear != ''">
-		        AND G.STYLE_YEAR IN (SELECT CD_NM 
-		                             FROM TB_COMMON_CODE 
-		                             WHERE CD_GB='G023' 
-		                             AND CD IN 
-		                             <foreach collection="multiStyleYear" item="item" index="index"  open="(" close=")" separator=",">
-		                             #{item}
-		                             </foreach>
-		                             )
-		        </if>
-		        <if test="seasonCd != null and seasonCd != ''">
-		        AND G.SEASON_CD = #{seasonCd}
-		        </if>
-		        <if test="multiSeasonCd != null and multiSeasonCd != ''">
-		        AND G.SEASON_CD IN
-		            <foreach collection="multiSeasonCd" item="item" index="index"  open="(" close=")" separator=",">
-		        #{item}
-		            </foreach>
-		        </if>
-		        <if test="sexGb != null and sexGb != ''">
-		        AND G.SEX_GB = #{sexGb}
-		        </if>
-		        <if test="changeableYn != null and changeableYn != ''">
-		        AND G.CHANGEABLE_YN = #{changeableYn}
-		        </if>
-		        <if test="returnableYn != null and returnableYn != ''">
-		        AND G.RETURNABLE_YN = #{returnableYn}
-		        </if>
-		        <if test="returnFeeFreeYn != null and returnFeeFreeYn != ''">
-		        AND G.RETURN_FEE_FREE_YN = #{returnFeeFreeYn}
-		        </if>
-		        <if test="changeFeeFreeYn != null and changeFeeFreeYn != ''">
-		        AND G.CHANGE_FEE_FREE_YN = #{changeFeeFreeYn}
-		        </if>
-		        <if test="formalGb != null and formalGb != ''">
-		        AND G.FORMAL_GB = #{formalGb}
-		        </if>
-		        <if test='soldOutYn != null and soldOutYn == "Y"'>
-		        AND EXISTS (
-		                    SELECT GOODS_CD 
-		                    FROM VW_STOCK
-		                    WHERE SOLDOUT_YN = 'Y'
-		                    AND GOODS_CD = G.GOODS_CD
-		                   )
-		        </if>
-		        <if test='soldOutYn != null and soldOutYn == "N"'>
-		        AND NOT EXISTS (
-		                    SELECT GOODS_CD 
-		                    FROM VW_STOCK
-		                    WHERE SOLDOUT_YN = 'Y'
-		                    AND GOODS_CD = G.GOODS_CD
-		                   )
-		        </if>
-		        <if test="erpStockLinkYn != null and erpStockLinkYn != ''">
-		        AND G.ERP_STOCK_LINK_YN = #{erpStockLinkYn}
-		        </if>
-		        <if test="erpPriceLinkYn != null and erpPriceLinkYn != ''">
-		        AND G.ERP_PRICE_LINK_YN = #{erpPriceLinkYn}
-		        </if>
-		        <if test="mdNo != null and mdNo > 0">
-		        AND G.BRAND_CD IN (
-		            SELECT DISTINCT BRAND_CD
-		            FROM   TB_BRAND_MD
-		            WHERE  MD_NO = #{mdNo}
-		        )
-		        </if>
-		        <if test="currPriceSt != null and currPriceSt != ''">
-		        AND G.CURR_PRICE >= #{currPriceSt}
-		        </if>
-		        <if test="currPriceEd != null and currPriceEd != ''">
-		        <![CDATA[
-		        AND G.CURR_PRICE <= #{currPriceEd}
-		         ]]>
-		        </if>
-		        <if test="dcRateSt != null and dcRateSt != ''">
-		        AND G.DC_RATE >= #{dcRateSt}
-		        </if>
-		        <if test="dcRateEd != null and dcRateEd != ''">
-		        <![CDATA[
-		        AND G.DC_RATE <= #{dcRateEd}
-		        ]]>
-		        </if>
-		        <if test='dateGbn != null and dateGbn == "P"'>
-		            <if test="stDate != null and stDate != ''">
-		        AND G.PRICE_UPD_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
-		            </if>
-		            <if test="edDate != null and edDate != ''">
-		            <![CDATA[
-		        AND G.PRICE_UPD_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-		            ]]>
-		            </if>
-		        </if>
-		        <if test='dateGbn != null and dateGbn == "R"'>
-		            <if test="stDate != null and stDate != ''">
-		        AND G.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
-		            </if>
-		            <if test="edDate != null and edDate != ''">
-		            <![CDATA[
-		        AND G.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-		            ]]>
-		            </if>
-		        </if>
-		        <if test='dateGbn != null and dateGbn == "S"'>
-		            <if test="stDate != null and stDate != ''">
-		        AND G.APPR_UPD_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
-		            </if>
-		            <if test="edDate != null and edDate != ''">
-		            <![CDATA[
-		        AND G.APPR_UPD_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-		            ]]>
-		            </if>
-		        </if>
-		        <if test="stockQtySt != null and stockQtySt != ''">
-		        AND ST.CURR_STOCK_QTY >= #{stockQtySt}
-		        </if>
-		        <if test="stockQtyEd != null and stockQtyEd != ''">
-		        <![CDATA[
-		        AND ST.CURR_STOCK_QTY <= #{stockQtyEd}
-		        ]]>
-		        </if>
-		        <if test="ageGrpCd != null and ageGrpCd != ''">
-		        AND G.AGE_GRP_CD = #{ageGrpCd}
-		        </if>
-		        <if test="cateCd != null and cateCd != ''">
-		        AND G.GOODS_CD IN (
-		            SELECT GOODS_CD
-		            FROM   TB_CATEGORY_GOODS
-		            WHERE  CATE_CD = #{cateCd}
-		        )
-		        </if>
-	</sql>
-	
-	<!-- 목록 페이징 정보 -->
-	<sql id="getListPagingCondition_sql">
-		<choose>
-		<when test="pageable != null">
-		    ) A
-		)Z WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
-		</when>
-		<otherwise>
-		    ) A
-		)Z
-		</otherwise>
-		</choose>
-	</sql>
-	
-	<!-- 상품 목록 기본정보 엑셀  -->
-	<select id="getGoodsInfoExcelList" parameterType="GoodsSearch" resultType="paramMap">
-		/* TsaGoods.getGoodsInfoExcelList */
-		SELECT G.GOODS_CD
-		     , B.BRAND_ENM
-		     , B.BRAND_GRP_NM
-		     , G.BRAND_CD
-		     , G.ITEMKIND_CD
-		     , (SELECT SUPPLY_COMP_NM FROM TB_SUPPLY_COMPANY WHERE SUPPLY_COMP_CD = G.SUPPLY_COMP_CD) AS SUPPLY_COMP_CD
-		     , G.SUPPLY_GOODS_CD
-		     , G.GOODS_NUM
-		     , G.GOODS_NM
-		     , G.GOODS_TYPE
-		     , FN_GET_CODE_NM('G008', G.GOODS_STAT) AS GOODS_STAT
-		     , G.LIST_PRICE
-		     , G.CURR_PRICE
-		     , G.DC_RATE
-		     , G.SELF_GOODS_YN
-		     , FN_GET_CODE_NM('G009', G.FORMAL_GB) AS FORMAL_GB
-		     , G.STYLE_YEAR
-		     , FN_GET_CODE_NM('G006', G.SEASON_CD) AS SEASON_CD
-		     , G.ERP_STOCK_LINK_YN
-		     , G.CHANGEABLE_YN
-		     , G.RETURNABLE_YN
-		     , G.SELL_FEE_RATE
-		     , DATE_FORMAT(G.PRICE_UPD_DT, '%Y-%m-%d %H:%i:%S') AS PRICE_UPD_DT
-		     , DATE_FORMAT(G.FRST_CFRM_DT, '%Y-%m-%d %H:%i:%S') AS FRST_CFRM_DT
-		     , CASE WHEN IMG_PATH1 IS NULL THEN
-		           'N'
-		       ELSE
-		           'Y'
-		       END AS GOODS_IMAGE_YN
-		     /*, (CASE WHEN G.GOODS_TYPE = 'N' THEN (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = G.GOODS_CD) 
-		             ELSE (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_EXTEND WHERE GOODS_CD = G.GOODS_CD) 
-		             END) AS STOCK_QTY_SUM*/
-		     , (SELECT ITEMKIND_NM FROM TB_ITEMKIND WHERE ITEMKIND_CD = G.ITEMKIND_CD) AS ITEMKIND_NM
-		     , GI.IMG_PATH1
-		     , GI.IMG_PATH6
-		     , GI.IMG_TYPE
-		     , G.REG_NO
-		     , DATE_FORMAT(G.REG_DT, '%Y-%m-%d %H:%i:%S') AS REG_DT
-		     , G.UPD_NO
-		     , DATE_FORMAT(G.UPD_DT, '%Y-%m-%d %H:%i:%S') AS UPD_DT
-		FROM TB_GOODS G
-		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
-		INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
-		<if test="searchGb != null and searchGb =='EXTEND'">
-		INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.EXTEND_GOODS_CD
-		                              AND GE.GOODS_CD IN
-		    <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
-		                              UPPER(#{item})
-		    </foreach>
-		</if>
-		<if test="searchGb != null and searchGb =='MASTER'">
-		INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.GOODS_CD
-		                              AND GE.EXTEND_GOODS_CD IN
-		    <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
-		                          UPPER(#{item})
-		    </foreach>
-		</if>
-		<if test="searchGb != null and searchGb =='EXCEL'">
-		INNER JOIN (
-		             SELECT SEARCH_CD
-		                  , TMP_DISP_ORD
-		             FROM (
-		                   SELECT SEARCH_CD
-		                        , MIN(DISP_ORD) AS TMP_DISP_ORD
-		                   FROM TB_SEARCH_DATA
-		                   WHERE REG_NO = #{regNo}
-		                   GROUP BY SEARCH_CD) T
-		          ) SD
-		           ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
-		                 OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
-		                <if test="mdNo != null and mdNo > 0">
-		                AND G.BRAND_CD IN (
-		                                   SELECT DISTINCT BRAND_CD
-		                                   FROM TB_BRAND_MD
-		                                   WHERE MD_NO = #{mdNo}
-		                                  )
-		               </if>
-		              )
-		</if>
-		LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
-		WHERE 1=1
-		<if test="searchGb == null or searchGb =='BASIC' or searchGb =='EXTEND' or searchGb =='MASTER'" >
-		<include refid="getGoodsListCondition_sql"/>
-		ORDER BY G.REG_DT DESC
-		</if>
-		<if test="searchGb == null or searchGb =='EXCEL'">
-		ORDER BY SD.TMP_DISP_ORD
-		</if>
-	</select>
-	
-	<!-- 상품 정보 -->
-	<select id="getGoods" parameterType="Goods" resultType="Goods">
-		/* TsaGoods.getGoods */
-		SELECT G.GOODS_CD
-		     , G.GOODS_NM
-		     , G.GOODS_TNM
-		     , G.GOODS_SNM
-		     , G.GOODS_SNM1
-		     , G.BRAND_CD
-		     , B.BRAND_GRP_NM
-		     , G.ITEMKIND_CD
-		     , G.STYLE_YEAR
-		     , G.SEASON_CD
-		     , G.SEX_GB
-		     , G.GOODS_NUM
-		     , G.COLOR_CD
-		     , G.MAIN_COLOR_YN
-		     , G.GOODS_TYPE
-		     , G.LIST_PRICE
-		     , G.CURR_PRICE
-		     , G.CURR_BPRICE
-		     , DATE_FORMAT(G.PRICE_UPD_DT, '%Y%m%d%H%i%S') AS PRICE_UPD_DT
-		     , G.DC_RATE
-		     , G.GOODS_STAT
-		     , G.SELF_GOODS_YN
-		     , G.SELF_MALL_YN
-		     , G.GOODS_GB
-		     , G.DISTRIBUTION_GB
-		     /*, (SELECT COLOR_GRP_FILE 
-		        FROM TB_COLOR TC 
-		        WHERE TC.COLOR_CD = G.COLOR_CD) AS COLOR_GRP_FILE */
-		     , G.SUPPLY_COMP_CD
-		     , G.SUPPLY_GOODS_CD
-		     , G.AGE_GRP_CD
-		     , G.DELV_FEE
-		     , G.MIN_ORD_AMT
-		     , G.PNT_PRATE
-		     , G.PNT_MRATE
-		     , G.SELL_FEE_RATE
-		     , G.FORMAL_GB
-		     , G.RETURNABLE_YN
-		     , G.PRE_PPNT_USABLE_YN
-		     , G.PRE_MPNT_USABLE_YN
-		     , G.MIN_ORD_QTY
-		     , G.MAX_ORD_QTY
-		     , G.DAY_MAX_ORD_QTY
-		     , G.ERP_STOCK_LINK_YN
-		     , G.ERP_PRICE_LINK_YN
-		     , G.MAKE_NM
-		     , G.MAKE_YMD
-		     , G.TAX_GB
-		     , G.GOODS_TYPE
-		     , FN_GET_CODE_NM('G056', G.GOODS_TYPE) AS GOODS_TYPE_NM
-		     , DATE_FORMAT(G.FRST_CFRM_DT, '%Y%m%d%H%i%S') AS FRST_CFRM_DT
-		     , (SELECT I.NI_CLSF_CD FROM TB_ITEMKIND I WHERE I.ITEMKIND_CD = G.ITEMKIND_CD) AS NI_CLSF_CD
-		     , GI.IMG_TYPE
-		     , GI.IMG_PATH1
-		     , GI.IMG_PATH6
-		     , CASE WHEN IMG_PATH1 IS NULL THEN
-		           'N'
-		       ELSE
-		           'Y'
-		       END AS GOODS_IMAGE_YN
-		     , (SELECT B.CD_NM 
-		       FROM TB_ITEMKIND A
-		          , TB_COMMON_CODE B 
-		       WHERE A.ITEMKIND_CD = G.ITEMKIND_CD 
-		       AND A.NI_CLSF_CD = B.CD 
-		       AND B.CD_GB = 'G004') AS  NI_CLSF_NM
-		     , FN_GET_USER_NM(G.UPD_NO) AS UPD_NM  
-		FROM TB_GOODS G
-		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
-		WHERE 1 = 1 
-		<choose>
-		<when test="goodsCd != null and goodsCd != ''">
-		AND G.GOODS_CD = #{goodsCd}
-		</when>
-		<otherwise>
-		AND G.SUPPLY_COMP_CD = #{supplyCompCd}
-		AND G.SUPPLY_GOODS_CD = #{supplyGoodsCd}
-		</otherwise>
-		</choose>
-	</select>
-	
-	<!-- 상품 상세 정보 조회 -->
-	<select id="getGoodsDescList" parameterType="GoodsDesc" resultType="GoodsDesc">
-		/* TsaGoods.getGoodsDescList */
-		SELECT GOODS_CD
-		     , DESC_GB
-		     , SEQ
-		     , GOODS_DESC
-		FROM TB_GOODS_DESC
-		WHERE GOODS_CD = #{goodsCd}
-		AND DESC_GB = #{descGb}
-		ORDER BY SEQ
-	</select>
-	
-	<!-- 상품 고시정보 조회 -->
-	<select id="getGoodsNotiInfoList" parameterType="GoodsNotiInfo" resultType="GoodsNotiInfo">
-		/* TsaGoods.getGoodsNotiInfoList */
-		SELECT C.GOODS_CD
-		     , C.NI_CLSF_CD
-		     , FN_GET_CODE_NM('G005', C.NI_ITEM_CD) AS NI_ITEM_NM
-		     , C.NI_ITEM_CD
-		     , C.NI_CONTENT
-		     , C.DISP_ORD
-		     , A.DISP_YN
-		     , A.REQ_YN
-		FROM TB_GOODS_NOTI_INFO C
-		INNER JOIN TB_NOTI_INFO A ON C.NI_CLSF_CD = A.NI_CLSF_CD
-		                          AND C.NI_ITEM_CD = A.NI_ITEM_CD
-		                          AND A.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
-		                                                 WHEN 'S0001' THEN 'S0001'
-		                                                 WHEN 'S0002' THEN 'S0002'
-		                                                 ELSE 'E' END
-		WHERE C.GOODS_CD = #{goodsCd}
-		AND C.NI_CLSF_CD = #{niClsfCd}
-		ORDER BY C.DISP_ORD
-	</select>
-	
-	<!-- 상품 기본정보 이력 생성 -->
-	<insert id="createGoodsHst" parameterType="Goods">
-		/* TsaGoods.createGoodsHst */
-		INSERT INTO TB_GOODS_HST 
-		(       GOODS_CD
-		      , BRAND_CD
-		      , ITEMKIND_CD
-		      , GOODS_NM
-		      , GOODS_TNM
-		      , GOODS_SNM
-		      , GOODS_SNM1
-		      , COLOR_CD
-		      , MAIN_COLOR_YN
-		      , STYLE_YEAR
-		      , SEASON_CD
-		      , SEX_GB
-		      , GOODS_NUM
-		      , GOODS_TYPE
-		      , LIST_PRICE
-		      , CURR_PRICE
-		      , CURR_BPRICE
-		      , PRICE_UPD_DT
-		      , DC_RATE
-		      , GOODS_STAT
-		      , SELF_MALL_YN
-		      , GOODS_GB
-		      , DISTRIBUTION_GB
-		      , SELF_GOODS_YN
-		      , SUPPLY_COMP_CD
-		      , SUPPLY_GOODS_CD
-		      , AGE_GRP_CD
-		      , DELV_FEE
-		      , MIN_ORD_AMT
-		      , PNT_PRATE
-		      , PNT_MRATE
-		      , SELL_FEE_RATE
-		      , FORMAL_GB
-		      , CHANGEABLE_YN
-		      , RETURNABLE_YN
-		      , CHANGE_FEE_FREE_YN
-		      , RETURN_FEE_FREE_YN
-		      , PRE_PPNT_USABLE_YN
-		      , PRE_MPNT_USABLE_YN
-		      , MIN_ORD_QTY
-		      , MAX_ORD_QTY
-		      , DAY_MAX_ORD_QTY
-		      , FRST_CFRM_DT
-		      , MAKE_NM
-		      , MAKE_YMD
-		      , TAX_GB
-		      , ERP_PRICE_LINK_YN
-		      , ERP_STOCK_LINK_YN
-		      , REG_NO
-		      , REG_DT
-		      , UPD_NO
-		      , UPD_DT
-		)
-		SELECT GOODS_CD            
-		     , BRAND_CD            
-		     , ITEMKIND_CD         
-		     , GOODS_NM            
-		     , GOODS_TNM           
-		     , GOODS_SNM           
-		     , GOODS_SNM1          
-		     , COLOR_CD            
-		     , MAIN_COLOR_YN
-		     , STYLE_YEAR          
-		     , SEASON_CD           
-		     , SEX_GB              
-		     , GOODS_NUM           
-		     , GOODS_TYPE          
-		     , LIST_PRICE          
-		     , CURR_PRICE          
-		     , CURR_BPRICE         
-		     , PRICE_UPD_DT        
-		     , DC_RATE             
-		     , GOODS_STAT          
-		     , SELF_MALL_YN             
-		     , GOODS_GB            
-		     , DISTRIBUTION_GB     
-		     , SELF_GOODS_YN       
-		     , SUPPLY_COMP_CD      
-		     , SUPPLY_GOODS_CD     
-		     , AGE_GRP_CD          
-		     , DELV_FEE            
-		     , MIN_ORD_AMT         
-		     , PNT_PRATE           
-		     , PNT_MRATE           
-		     , SELL_FEE_RATE       
-		     , FORMAL_GB           
-		     , CHANGEABLE_YN       
-		     , RETURNABLE_YN       
-		     , CHANGE_FEE_FREE_YN  
-		     , RETURN_FEE_FREE_YN  
-		     , PRE_PPNT_USABLE_YN  
-		     , PRE_MPNT_USABLE_YN  
-		     , MIN_ORD_QTY         
-		     , MAX_ORD_QTY         
-		     , DAY_MAX_ORD_QTY     
-		     , FRST_CFRM_DT        
-		     , MAKE_NM             
-		     , MAKE_YMD            
-		     , TAX_GB              
-		     , ERP_PRICE_LINK_YN   
-		     , ERP_STOCK_LINK_YN   
-		     , #{regNo}              
-		     , NOW()              
-		     , UPD_NO              
-		     , UPD_DT              
-		FROM TB_GOODS
-		WHERE GOODS_CD = #{goodsCd}
-	</insert>
-	
-	<!-- 상품  수정 항목 일괄변경 -->
-	<update id="updateGoodsState" parameterType="Goods">
-		/* TsaGoods.updateGoodsState */
-		UPDATE TB_GOODS SET
-		      UPD_NO = #{updNo}
-		    , UPD_DT = NOW()
-		<if test="goodsStat != null and goodsStat != ''" >
-		    , GOODS_STAT = #{goodsStat}
-		    , FRST_CFRM_DT = IF(#{chGoodsStatYn} = 'Y', COALESCE(FRST_CFRM_DT, NOW()) , FRST_CFRM_DT)
-		</if>
-		<if test="erpStockLinkYn != null and erpStockLinkYn != ''" >
-		    , ERP_STOCK_LINK_YN = #{erpStockLinkYn}
-		</if>
-		<if test="erpPriceLinkYn != null and erpPriceLinkYn != ''" >
-		    , ERP_PRICE_LINK_YN = #{erpPriceLinkYn}
-		</if>
-		<if test="formalGb != null and formalGb != ''" >
-		    , FORMAL_GB = #{formalGb}
-		    , PNT_PRATE = IFNULL(#{pntPrate}, PNT_PRATE)
-		    , PNT_MRATE = IFNULL(#{pntMrate}, PNT_MRATE)
-		</if>
-		<if test='procJob == "pntPrate" and pntPrate != null' >
-		    , PNT_PRATE = #{pntPrate}
-		</if>
-		<if test='procJob == "pntMrate"  and pntMrate != null' >
-		    , PNT_MRATE = #{pntMrate}
-		</if>
-		<if test="returnableYn != null and returnableYn != ''" >
-		    , RETURNABLE_YN = #{returnableYn}
-		</if>
-		<if test="changeableYn != null and changeableYn != ''" >
-		    , CHANGEABLE_YN = #{changeableYn}
-		</if>
-		<if test="prePpntUsableYn != null and prePpntUsableYn != ''" >
-		    , PRE_PPNT_USABLE_YN = #{prePpntUsableYn}
-		</if>
-		<if test="preMpntUsableYn != null and preMpntUsableYn != ''" >
-		    , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
-		</if>
-		<if test='procJob == "minOrdAmt"  and minOrdAmt != null and minOrdAmt != ""' >
-		    , MIN_ORD_AMT = #{minOrdAmt}
-		</if>
-		<if test='blankFlag != null and blankFlag == "Y"'>
-		    , GOODS_TNM = ''
-		</if>
-		<if test="goodsTnm != null and goodsTnm != ''" >
-		    , GOODS_TNM = #{goodsTnm}
-		</if>
-		<if test="minOrdQty != null and minOrdQty > 0" >
-		    , MIN_ORD_QTY = #{minOrdQty}
-		</if>
-		<if test="maxOrdQty != null and maxOrdQty > 0" >
-		    , MAX_ORD_QTY = #{maxOrdQty}
-		</if>
-		<if test="dayMaxOrdQty != null and dayMaxOrdQty > 0" >
-		    , DAY_MAX_ORD_QTY = #{dayMaxOrdQty}
-		</if>
-		WHERE GOODS_CD = #{goodsCd}
-	</update>
-	
-	<!-- 상품 이미지 필수  항목 입력 여부  조회 -->
-	<select id="getGoodsImgsYn" parameterType="Goods" resultType="Goods">
-		/* TsaGoods.getGoodsImgsYn */
-		SELECT A.GOODS_CD
-		     , A.SUPPLY_COMP_CD
-		     , (SELECT I.NI_CLSF_CD FROM TB_ITEMKIND I WHERE I.ITEMKIND_CD = A.ITEMKIND_CD) AS NI_CLSF_CD
-		     , CASE WHEN B.IMG_PATH1 IS NULL THEN
-		            'N'
-		       ELSE
-		            'Y'
-		       END AS GOODS_IMAGE_YN
-		FROM TB_GOODS A
-		LEFT OUTER JOIN TB_GOODS_IMG B ON A.GOODS_CD = B.GOODS_CD
-		WHERE 1 = 1
-		<choose>
-		<when test="goodsCd != null and goodsCd != ''">
-		AND A.GOODS_CD  = #{goodsCd}
-		</when>
-		<otherwise>
-		AND A.GOODS_CD IN
-		    <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
-		#{item}
-		    </foreach>
-		</otherwise>
-		</choose>
-	</select>
-	
-	<!-- 상품 정보 이력 -->
-	<select id="getGoodsHstList" parameterType="Goods" resultType="GoodsHst">
-		/*TsaGoods.getGoodsHstList*/
-		SELECT CURR_PRICE
-		     , CURR_BPRICE
-		     , GOODS_NM
-		     , GOODS_TNM
-		     , GOODS_SNM
-		     , FORMAL_GB
-		     , GOODS_STAT
-		     , SELL_FEE_RATE
-		     , ERP_STOCK_LINK_YN
-		     , CHANGEABLE_YN
-		     , PRE_PPNT_USABLE_YN
-		     , PRE_MPNT_USABLE_YN
-		     , GOODS_SNM1
-		     , ITEMKIND_CD
-		     , SELF_MALL_YN
-		     , DATE_FORMAT(FRST_CFRM_DT, '%Y%m%d%H%i%S') AS FRST_CFRM_DT
-		     , UPD_NO
-		     , FN_GET_USER_NM(UPD_NO) AS UPD_NM
-		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
-		     , REG_NO
-		     , FN_GET_USER_NM(REG_NO) AS REG_NM
-		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
-		FROM TB_GOODS_HST
-		WHERE GOODS_CD = #{goodsCd}
-		ORDER BY REG_DT DESC
-	</select>
-	
-	<!-- 상품 품목 변경 -->
-	<update id="updateGoodItemKindCd" parameterType="Goods">
-		/* TsaGoods.updateGoodItemKindCd */
-		UPDATE TB_GOODS
-		SET ITEMKIND_CD = #{itemkindCd}
-		  , UPD_NO = #{updNo}
-		  , UPD_DT = NOW()
-		WHERE GOODS_CD = #{goodsCd}
-	</update >
-	
-	<!-- 상품 자동 검색어 조회-->
-	<select id="getGoodsSnm" parameterType="String" resultType="String">
-		/* TsaGoods.getGoodsSnm */
-		SELECT UPPER(CONCAT(
-		       G.GOODS_CD,';',
-		       REPLACE(G.GOODS_NM,' ',''),';',
-		       B.BRAND_ENM,';',
-		       B.BRAND_KNM,';',
-		       B.BRAND_GRP_NM,';',
-		       G.STYLE_YEAR,';',
-		       FN_GET_CODE_NM('G006',G.SEASON_CD),';',
-		       FN_GET_CODE_NM('G007',G.SEX_GB),';',
-		       G.COLOR_CD,';',
-		       C.COLOR_ENM,';',
-		       C.COLOR_KNM,';',
-		       REPLACE(I.ITEMKIND_NM,'>',';')
-		       )) AS GOODS_SNM
-		FROM TB_GOODS G
-		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		LEFT OUTER JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD
-		LEFT OUTER JOIN TB_COLOR C ON G.COLOR_CD = C.COLOR_CD
-		WHERE G.GOODS_CD = #{goodsCd}
-	</select>
-	
-	<!-- 상품검색어 수정 -->
-	<update id="updateGoodsSnm" parameterType="Goods">
-		/* TsaGoods.updateGoodsSnm */
-		UPDATE TB_GOODS A
-		SET UPD_NO = #{updNo}
-		  , UPD_DT = NOW()
-		  , GOODS_SNM = #{goodsSnm} 
-		WHERE GOODS_CD = #{goodsCd}
-	</update>
-	
-	<!-- 상품 품목변경 고시정보 조회  -->
-	<select id="getNewNotiInfo" parameterType="Goods" resultType="GoodsNotiInfo">
-		/* TsaGoods.getNewNotiInfo */
-		SELECT D.NI_CLSF_CD
-		     , NVL(C.NI_ITEM_CD, D.NI_ITEM_CD) AS NI_ITEM_CD
-		     , NVL(C.NI_CONTENT, D.NI_CONTENT) AS NI_CONTENT
-		     , D.DISP_ORD
-		FROM (
-		       SELECT A.NI_CLSF_CD
-		          , A.NI_ITEM_CD
-		          , A.NI_CONTENT
-		          , A.DISP_ORD
-		       FROM TB_NOTI_INFO A
-		          , TB_ITEMKIND B
-		       WHERE A.NI_CLSF_CD = B.NI_CLSF_CD
-		       AND A.SUPPLY_COMP_CD = #{supplyCompCd}
-		       AND B.ITEMKIND_CD = #{itemkindCd}
-		     ) D
-		    LEFT OUTER JOIN (
-		       SELECT NI_ITEM_CD
-		            , NI_CONTENT 
-		       FROM TB_GOODS_NOTI_INFO
-		       WHERE GOODS_CD = #{goodsCd}
-		     ) C
-		     ON (
-		       C.NI_ITEM_CD = D.NI_ITEM_CD
-		     )
-		ORDER BY D.DISP_ORD
-	</select>
-	
-	<!-- 상품 품목변경 고시정보 삭제  -->
-	<delete id="deleteGoodsNotiInfo" parameterType="Goods">
-		/* TsaGoods.deleteGoodsNotiInfo */
-		DELETE FROM TB_GOODS_NOTI_INFO
-		WHERE GOODS_CD = #{goodsCd}
-	</delete>
-	
-	<!-- 상품 고시 정보  저장 -->
-	<update id="saveGoodsNotiInfo" parameterType="GoodsNotiInfo">
-		/* TsaGoods.saveGoodsNotiInfo */
-		INSERT INTO TB_GOODS_NOTI_INFO(
-		       GOODS_CD
-		     , NI_CLSF_CD
-		     , NI_ITEM_CD
-		     , NI_CONTENT
-		     , DISP_ORD
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{goodsCd}
-		     , #{niClsfCd}
-		     , #{niItemCd}
-		     , #{niContent}
-		     , #{dispOrd}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       NI_CONTENT = #{niContent}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</update>
-	
-	<!-- 상품 사이즈 조회 -->
-	<select id="getGoodsSizeList" parameterType="Goods" resultType="Option">
-		/* TsaGoods.getGoodsSizeList */
-		WITH RECURSIVE TMP_GOODS AS (
-		    SELECT A.GOODS_CD 
-		         , A.GOODS_TYPE 
-		         , IFNULL(B.COMPS_GOODS_CD, A.GOODS_CD) AS COMPS_GOODS_CD
-		         , IFNULL(B.DISP_ORD,1) AS DISP_ORD
-		         , A.SELF_GOODS_YN
-		    FROM TB_GOODS A 
-		    LEFT OUTER JOIN TB_GOODS_COMPOSE B ON A.GOODS_CD = B.GOODS_CD
-		    WHERE A.GOODS_CD = #{goodsCd}
-		    )
-		SELECT #{goodsCd} AS GOODS_CD
-		     , A.GOODS_CD AS COMPS_GOODS_CD
-		     , A.OPT_CD
-		     , CONCAT(A.OPT_NM1,  NVL2(A.OPT_NM2, '', CONCAT('/', A.OPT_NM2))) AS OPT_NM 
-		     , A.OPT_NM1
-		     , A.OPT_NM2
-		     , A.BASE_STOCK_QTY
-		     , A.CURR_STOCK_QTY
-		     , IFNULL(B.STOCK_QTY,0) AS SALE_STOCK_QTY
-		     , GREATEST(GREATEST(A.CURR_STOCK_QTY - A.BASE_STOCK_QTY, 0) - IFNULL(B.STOCK_QTY, 0), 0) AS ABLE_STOCK_QTY
-		     , A.SOLDOUT_YN
-		     , A.DISP_ORD
-		     , A.DISP_YN
-		     , COUNT(*) OVER(PARTITION BY A.GOODS_CD ) AS RCOUNT
-		     , ROW_NUMBER() OVER(PARTITION BY A.GOODS_CD ORDER BY A.DISP_ORD) AS RNUM
-		FROM  TMP_GOODS C 
-		INNER JOIN TB_OPTION A ON C.COMPS_GOODS_CD = A.GOODS_CD 
-		LEFT OUTER JOIN (
-		                 SELECT Z.GOODS_CD
-		                      , Z.OPT_CD
-		                      , SUM((CASE Z.SELL_GB WHEN '10' THEN 1
-		                                            WHEN '20' THEN 1
-		                                            ELSE -1 END) * Z.SELL_QTY) AS STOCK_QTY
-		                 FROM TB_SELL_QTY Z
-		                 INNER JOIN TMP_GOODS Y ON Z.GOODS_CD = Y.COMPS_GOODS_CD
-		                 GROUP BY Z.GOODS_CD, Z.OPT_CD
-		                ) B
-		           ON (  A.GOODS_CD = B.GOODS_CD
-		             AND A.OPT_CD = B.OPT_CD)
-		WHERE 1 = 1
-		AND C.GOODS_CD = #{goodsCd}
-		ORDER BY C.DISP_ORD, A.DISP_ORD
-	</select>
-	
-	<!-- 구성상품 목록 -->
-	<select id="getGoodsDetailComposeList" parameterType="Goods" resultType="GoodsCompose">
-		/* TsaGoods.getGoodsDetailComposeList */
-		SELECT A.GOODS_CD
-		     , A.GOODS_TYPE
-		     , FN_GET_CODE_NM('G056', A.GOODS_TYPE) AS GOODS_TYPE_NM
-		     , A.COMPS_GOODS_CD
-		     , B.GOODS_NM AS COMPS_GOODS_NM
-		     , A.DISP_ORD
-		     , A.QTY
-		     , A.COMPS_CURR_PRICE
-		     , A.COMPS_CURR_PRICE AS COMPS_CURR_PRICE_ORG
-		     , A.COMPS_GOODS_OPT_NM
-		     , A.BASE_YN
-		     , A.USE_YN
-		     , B.CURR_PRICE
-		     , B.GOODS_STAT
-		     , B.SELF_GOODS_YN
-		     , B.SUPPLY_COMP_CD
-		     , I.IMG_PATH1
-		     , I.IMG_PATH6
-		     , I.IMG_TYPE
-		     , A.REG_NO
-		     , FN_GET_USER_NM(A.REG_NO) AS REG_NM
-		     , DATE_FORMAT(A.REG_DT, '%Y%m%d%H%i%S') AS REG_DT
-		     , A.UPD_NO
-		     , FN_GET_USER_NM(A.UPD_NO) AS UPD_NM
-		     , DATE_FORMAT(A.UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
-		FROM TB_GOODS_COMPOSE A
-		INNER JOIN  TB_GOODS B ON A.COMPS_GOODS_CD = B.GOODS_CD
-		LEFT OUTER JOIN TB_GOODS_IMG I ON A.COMPS_GOODS_CD = I.GOODS_CD
-		WHERE A.GOODS_CD = #{goodsCd}
-		ORDER BY A.DISP_ORD 
-	</select>
-	
-	<!-- 상품 기본 정보 등록 -->
-	<insert id="createGoods" parameterType="Goods">
-		/* TsaGoods.createGoods */
-		INSERT INTO TB_GOODS (
-		    GOODS_CD
-		  , BRAND_CD
-		  , ITEMKIND_CD
-		  , GOODS_NM
-		  , GOODS_TNM
-		  , GOODS_SNM
-		  , GOODS_SNM1
-		  , COLOR_CD
-		  , MAIN_COLOR_YN
-		  , STYLE_YEAR
-		  , SEASON_CD
-		  , SEX_GB
-		  , GOODS_NUM
-		  , GOODS_TYPE
-		  , LIST_PRICE
-		  , CURR_PRICE
-		  , DC_RATE
-		  , GOODS_STAT
-		  , SELF_MALL_YN
-		  , GOODS_GB
-		  , DISTRIBUTION_GB
-		  , SELF_GOODS_YN
-		  , SUPPLY_COMP_CD
-		  , SUPPLY_GOODS_CD
-		  , AGE_GRP_CD
-		  , DELV_FEE
-		  , MIN_ORD_AMT
-		  , PNT_PRATE
-		  , PNT_MRATE
-		  , SELL_FEE_RATE
-		  , FORMAL_GB
-		  , MAKE_NM
-		  , MAKE_YMD
-		  , TAX_GB
-		  , ERP_STOCK_LINK_YN
-		  , REG_NO
-		  , REG_DT
-		  , UPD_NO
-		  , UPD_DT
-		)
-		VALUES(
-		    #{goodsCd}
-		  , #{brandCd}
-		  , #{itemkindCd}
-		  , NVL(#{goodsNm},'상품명없음')
-		  , #{goodsTnm}
-		  , #{goodsSnm}
-		  , #{goodsSnm1}
-		  , #{colorCd}
-		  , #{mainColorYn}
-		  , #{styleYear}
-		  , #{seasonCd}
-		  , #{sexGb}
-		  , #{goodsNum}
-		  , NVL(#{goodsType},'N')
-		  , #{listPrice}
-		  , #{currPrice}
-		  , #{dcRate}
-		  , #{goodsStat}
-		  , NVL(#{selfMallYn},'Y') 
-		  , #{goodsGb}
-		  , #{distributionGb}
-		  , #{selfGoodsYn}
-		  , #{supplyCompCd}
-		  , #{supplyGoodsCd}
-		  , #{ageGrpCd}
-		  , #{delvFee}
-		  , #{minOrdAmt}
-		  , #{pntPrate}
-		  , #{pntMrate}
-		  , #{sellFeeRate}
-		  , #{formalGb}
-		  , #{makeNm}
-		  , #{makeYmd}
-		  , #{taxGb}
-		  , NVL(#{erpStockLinkYn},'N')
-		  , #{regNo}
-		  , NOW()
-		  , #{updNo}
-		  , NOW()
-		)
-	</insert>
-	
-	<!-- 상품 기본 정보 등록 -->
-	<insert id="createGoodsSmmary" parameterType="Goods">
-		/* TsaGoods.createGoodsSmmary */
-		INSERT INTO TB_GOODS_SUMMARY (
-		    GOODS_CD
-		  , REG_NO
-		  , REG_DT
-		  , UPD_NO
-		  , UPD_DT
-		)
-		VALUES(
-		    #{goodsCd}
-		  , #{regNo}
-		  , NOW()
-		  , #{updNo}
-		  , NOW()
-		)
-	</insert>
-	
-	<!-- 상품 기본 정보 수정 -->
-	<update id="updateGoods" parameterType="Goods">
-		/* TsaGoods.updateGoods */
-		UPDATE TB_GOODS
-		SET GOODS_TNM = #{goodsTnm}
-		  , GOODS_NM = #{goodsNm}
-		  , SEASON_CD = #{seasonCd}
-		  , SEX_GB = #{sexGb}
-		  , CURR_PRICE = #{currPrice}
-		  <if test="currBprice != null and currBprice != ''">
-		  , CURR_BPRICE = #{currBprice}
-		  , PRICE_UPD_DT = NOW()
-		  </if>
-		  , DC_RATE = #{dcRate}
-		  , GOODS_STAT = #{goodsStat}
-		  , GOODS_GB = #{goodsGb}
-		  , MIN_ORD_AMT = #{minOrdAmt}
-		  , PNT_PRATE = #{pntPrate}
-		  , PNT_MRATE = #{pntMrate}
-		  , FORMAL_GB = #{formalGb}
-		  , MIN_ORD_QTY = #{minOrdQty}
-		  , MAX_ORD_QTY = #{maxOrdQty}
-		  , DAY_MAX_ORD_QTY = #{dayMaxOrdQty}
-		  , ERP_STOCK_LINK_YN = #{erpStockLinkYn}
-		  , GOODS_SNM1 = #{goodsSnm1}
-		  , SELF_MALL_YN = #{selfMallYn}
-		  , GOODS_SNM = #{goodsSnm}
-		  , FRST_CFRM_DT = (CASE #{chGoodsStatYn} WHEN 'Y' THEN NVL2(FRST_CFRM_DT, NOW(), FRST_CFRM_DT)
-		                                          ELSE FRST_CFRM_DT END)
-		  , PRE_PPNT_USABLE_YN = #{prePpntUsableYn}
-		  , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
-		  , DISTRIBUTION_GB = #{distributionGb}
-		  , AGE_GRP_CD = #{ageGrpCd}
-		  , SELL_FEE_RATE = #{sellFeeRate}
-		  , UPD_NO = #{updNo}
-		  , UPD_DT = NOW()
-		WHERE GOODS_CD = #{goodsCd}
-	</update>
-	
-	<!-- 상품 상세정보 삭제 -->
-	<delete id="deleteGoodsDesc" parameterType="GoodsDesc">
-		/* TsaGoods.deleteGoodsDesc */
-		DELETE FROM TB_GOODS_DESC
-		WHERE GOODS_CD = #{goodsCd}
-		AND DESC_GB = #{descGb}
-	</delete>
-	
-	<!-- 상품 상세정보 등록 -->
-	<insert id="createGoodsDesc" parameterType="GoodsDesc">
-		/* TsaGoods.createGoodsDesc */
-		INSERT INTO TB_GOODS_DESC (
-		    GOODS_CD
-		  , DESC_GB
-		  , SEQ
-		  , GOODS_DESC
-		  , REG_NO
-		  , REG_DT
-		)
-		VALUES(
-		    #{goodsCd}
-		  , #{descGb}
-		  , #{seq}
-		  , REPLACE(#{goodsDesc},char(13), CONCAT(char(13),char(10)))
-		  , #{regNo}
-		  , NOW()
-		)
-	</insert>
-	
-	<!-- 구상 상품등록/저장 -->
-	<insert id="saveGoodsCompose" parameterType="GoodsCompose">
-		/* TsaGoods.saveGoodsCompose */
-		INSERT INTO TB_GOODS_COMPOSE (
-		           GOODS_CD
-		         , COMPS_GOODS_CD
-		         , GOODS_TYPE
-		         , DISP_ORD
-		         , QTY
-		         , COMPS_CURR_PRICE
-		         , COMPS_GOODS_OPT_NM
-		         , BASE_YN
-		         , USE_YN
-		         , REG_NO
-		         , REG_DT
-		         , UPD_NO
-		         , UPD_DT
-		    )
-		    VALUES (
-		           #{goodsCd}
-		         , #{compsGoodsCd}
-		         , #{goodsType}
-		         , #{dispOrd}
-		         , #{qty}
-		         , (CASE WHEN #{goodsType} = 'G056_S' THEN #{compsCurrPrice}
-		                ELSE 0 END)
-		         , #{compsGoodsOptNm}
-		         , #{baseYn}
-		         , #{useYn}
-		         , #{regNo}
-		         , NOW()
-		         , #{updNo}
-		         , NOW()
-		    )
-		ON DUPLICATE KEY UPDATE 
-		           DISP_ORD = #{dispOrd}
-		         , COMPS_GOODS_OPT_NM = #{compsGoodsOptNm}
-		         , COMPS_CURR_PRICE = (CASE WHEN #{goodsType} = 'G056_S' THEN #{compsCurrPrice}
-		                                    ELSE 0 END)
-		         , USE_YN = #{useYn}
-		         , UPD_NO = #{updNo}
-		         , UPD_DT = NOW()
-	</insert>
-	
-	<!-- 상품 옵션/재고 정보 이력생성 -->
-	<insert id="createStockHst" parameterType="Option">
-	/* TsaGoods.createStockHst */
-		INSERT INTO TB_OPTION_HST 
-		(     OPTION_HST_SQ
-		    , GOODS_CD
-		    , OPT_CD
-		    , OPT_NM1
-		    , OPT_NM2
-		    , BASE_STOCK_QTY
-		    , CURR_STOCK_QTY
-		    , ADD_PRICE
-		    , SOLDOUT_YN
-		    , DISP_ORD
-		    , DISP_YN
-		    , REG_NO
-		    , REG_DT
-		    , UPD_NO
-		    , UPD_DT
-		)
-		SELECT NULL
-		     , GOODS_CD
-		     , OPT_CD
-		     , OPT_NM1
-		     , OPT_NM2
-		     , BASE_STOCK_QTY
-		     , CURR_STOCK_QTY
-		     , ADD_PRICE
-		     , SOLDOUT_YN
-		     , DISP_ORD
-		     , DISP_YN
-		     , #{regNo}
-		     , NOW()
-		     , UPD_NO
-		     , UPD_DT
-		FROM TB_OPTION
-		WHERE GOODS_CD = #{goodsCd}
-		<if test='optCd != null and optCd != ""'>
-		AND OPT_CD = #{optCd}
-		</if>
-	</insert>
-	
-	<!-- 상품 옵션/재고 정보 저장 -->
-	<update id="saveStock" parameterType="Option">
-		/* TsaGoods.saveStock */
-		INSERT INTO TB_OPTION(
-		       GOODS_CD
-		     , OPT_CD
-		     , OPT_NM1
-		     , OPT_NM2
-		     , BASE_STOCK_QTY
-		     , CURR_STOCK_QTY
-		     , ADD_PRICE
-		     , SOLDOUT_YN
-		     , DISP_ORD
-		     , DISP_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{goodsCd}
-		     , #{optCd}
-		     , #{optNm1}
-		     , #{optNm2}
-		     , #{baseStockQty}
-		     , #{currStockQty}
-		     , #{addPrice}
-		     , #{soldoutYn}
-		     , #{dispOrd}
-		     , #{dispYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE 
-		        BASE_STOCK_QTY = #{baseStockQty}
-		      , OPT_NM1 = #{optNm1}
-		      , OPT_NM2 = #{optNm2}
-		      , ADD_PRICE = #{addPrice}
-		      , SOLDOUT_YN = #{soldoutYn}
-		      , DISP_ORD = #{dispOrd}
-		      , DISP_YN = #{dispYn}
-		      , UPD_NO = #{updNo}
-		      , UPD_DT = NOW()
-		      <if test='selfGoodsYn != null and selfGoodsYn == "N"'>
-		      , CURR_ON_STOCK_QTY = #{currOnStockQty}
-		      </if>
-	</update>
-	
-	<!-- 같은 품번 상품목록  -->
-	<select id="getGoodsNumGoodsList" parameterType="Goods" resultType="Goods">
-		/* TsaGoods.getGoodsNumGoodsList */
-		SELECT G.GOODS_CD
-		     , G.GOODS_NM
-		     , G.COLOR_CD
-		     , G.MAIN_COLOR_YN
-		     , G.GOODS_NUM
-		     , G.GOODS_STAT
-		     , GI.IMG_PATH1
-		     , GI.IMG_PATH6
-		     , GI.IMG_TYPE
-		FROM TB_GOODS G
-		LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
-		WHERE GOODS_NUM = (SELECT GOODS_NUM FROM TB_GOODS TG WHERE GOODS_CD = #{goodsCd})
-	</select>
-	
-	<!-- 상품코드 생성 -->
-	<insert id="createGoodsSequence" parameterType="Goods">
-		/* TsaGoods.createGoodsSequence */
-		<selectKey keyProperty="goodsSq" resultType="int" order="AFTER">
-		SELECT MAX(GOODS_SQ) FROM TB_GOODS_SEQUENCE
-		</selectKey>
-		INSERT INTO TB_GOODS_SEQUENCE (GOODS_SQ) VALUES (NULL)
-	</insert>
-
-	<!-- 상품 타이틀 예약관리 목록 건수 -->
-	<select id="getGoodsTitleReserveCount" parameterType="GoodsSearch" resultType="int">
-		/* TsaGoods.getGoodsTitleReserveCount */
-		SELECT COUNT(*) AS TOTCNT
-		FROM TB_GOODS G
-		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
-		INNER JOIN TB_GOODS_TNM_RES GR ON G.GOODS_CD = GR.GOODS_CD
-		<if test="searchGb == null or searchGb =='BASIC'" >
-		    <if test="applyStdt != null and applyStdt != ''">
-		                               AND GR.APPLY_EDDT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
-		    </if>
-		    <if test="applyEddt != null and applyEddt != ''">
-		    <![CDATA[
-		                               AND GR.APPLY_STDT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-		    ]]>
-		    </if>
-		    <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
-		                               AND GR.APPLY_EDDT >= NOW() 
-		    </if>
-		</if>
-		<if test="searchGb != null and searchGb =='EXCEL'">
-		INNER JOIN (
-		            SELECT SEARCH_CD
-		                 , TMP_DISP_ORD
-		            FROM (
-		                  SELECT SEARCH_CD
-		                       , MIN(DISP_ORD) AS TMP_DISP_ORD
-		                  FROM TB_SEARCH_DATA
-		                  WHERE REG_NO = #{regNo}
-		                  GROUP BY SEARCH_CD) T
-		          ) SD
-		          ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
-		               OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
-		               <if test="mdNo != null and mdNo > 0">
-		               AND G.BRAND_CD IN (
-		                                  SELECT DISTINCT BRAND_CD
-		                                  FROM TB_BRAND_MD
-		                                  WHERE MD_NO = #{mdNo}
-		                                  )
-		              </if>
-		           )
-		</if>
-		WHERE 1=1
-		<if test="searchGb == null or searchGb =='BASIC'" >
-		<include refid="getGoodsListCondition_sql"/>
-		</if>
-	</select>
-
-	<!-- 상품 타이틀 예약관리 목록 -->
-	<select id="getGoodsTitleReserveList" parameterType="GoodsSearch" resultType="GoodsTnmRes">
-		/* TsaGoods.getGoodsTitleReserveList */
-		SELECT Z.*
-		FROM (
-		    SELECT A.*, @rownum := @rownum + 1 AS RNUM FROM (
-		        SELECT
-		                G.GOODS_CD
-		              , B.BRAND_ENM
-		              , B.BRAND_GRP_NM
-		              , G.BRAND_CD
-		              , G.SUPPLY_COMP_CD
-		              , G.SUPPLY_GOODS_CD
-		              , G.GOODS_NM
-		              , G.GOODS_TNM
-		              , G.SELF_GOODS_YN
-		              , G.GOODS_STAT
-		              , GR.GOODS_TNM_RES_SQ
-		              , GR.GOODS_TNM AS REG_GOODS_TNM
-		              , DATE_FORMAT(GR.APPLY_STDT,'%Y%m%d%H%i%S') AS APPLY_STDT
-		              , DATE_FORMAT(GR.APPLY_EDDT,'%Y%m%d%H%i%S') AS APPLY_EDDT
-		              , GR.REG_NO
-		              , FN_GET_USER_NM(GR.REG_NO) AS REG_NM
-		              , DATE_FORMAT(GR.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		        FROM TB_GOODS G
-		        JOIN ( SELECT @rownum := 0) R
-		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
-		        INNER JOIN TB_GOODS_TNM_RES GR ON G.GOODS_CD = GR.GOODS_CD
-		        <if test="searchGb == null or searchGb =='BASIC'" >
-		            <if test="applyStdt != null and applyStdt != ''">
-		                                       AND GR.APPLY_EDDT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
-		            </if>
-		            <if test="applyEddt != null and applyEddt != ''">
-		            <![CDATA[
-		                                       AND GR.APPLY_STDT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-		            ]]>
-		            </if>
-		            <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
-		                                       AND GR.APPLY_EDDT >= NOW() 
-		            </if>
-		        </if>
-		        <if test="searchGb != null and searchGb =='EXCEL'">
-		        INNER JOIN (
-		                    SELECT SEARCH_CD
-		                         , TMP_DISP_ORD
-		                    FROM (
-		                          SELECT SEARCH_CD
-		                               , MIN(DISP_ORD) AS TMP_DISP_ORD
-		                          FROM TB_SEARCH_DATA
-		                          WHERE REG_NO = #{regNo}
-		                          GROUP BY SEARCH_CD) T
-		                  ) SD
-		                  ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
-		                       OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
-		                       <if test="mdNo != null and mdNo > 0">
-		                      AND G.BRAND_CD IN (
-		                                          SELECT DISTINCT BRAND_CD
-		                                          FROM TB_BRAND_MD
-		                                          WHERE MD_NO = #{mdNo}
-		                                          )
-		                      </if>
-		                   )
-		        </if>
-		        WHERE 1=1
-		        <if test="searchGb == null or searchGb =='BASIC'" >
-		        <include refid="getGoodsListCondition_sql"/>
-		        ORDER BY  GR.APPLY_STDT DESC, GR.APPLY_EDDT DESC, G.GOODS_CD, GR.GOODS_TNM_RES_SQ
-		        </if>
-		        <if test="searchGb != null and searchGb =='EXCEL'">
-		        ORDER BY SD.TMP_DISP_ORD
-		        </if>
-		<include refid="getListPagingCondition_sql"/>
-	</select>
-
-	<!-- 상품 타이틀 예약조회(기간 체크용) -->
-	<select id="getGoodsTnmDupChkCount" parameterType="GoodsTnmRes" resultType="int">
-		/* TsaGoods.getGoodsTnmDupChkCount */
-		SELECT COUNTS(GOODS_CD)
-		FROM TB_GOODS_TNM_RES
-		WHERE 1=1
-		<![CDATA[
-		AND APPLY_STDT <= DATE_FORMAT(#{applyStdt}, '%Y%m%d%H%i%S')
-		]]>
-		AND APPLY_EDDT >= DATE_FORMAT(#{applyEddt},'%Y%m%d%H%i%S')
-		AND GOODS_CD = #{goodsCd}
-	</select>
-	
-	<!-- 상품 타이틀 예약 등록 -->
-	<insert id="createGoodTnmRes" parameterType="GoodsTnmRes">
-		/* TsaGoods.createGoodTnmRes */
-		INSERT INTO TB_GOODS_TNM_RES (
-		    GOODS_TNM_RES_SQ
-		  , GOODS_CD
-		  , GOODS_TNM
-		  , APPLY_STDT
-		  , APPLY_EDDT
-		  , REG_NO
-		  , REG_DT
-		  , UPD_NO
-		  , UPD_DT
-		)
-		VALUES(
-		    NULL
-		  , #{goodsCd}
-		  , #{goodsTnm}
-		  , STR_TO_DATE(#{applyStdt},'%Y%m%d%H%i%S')
-		  , STR_TO_DATE(#{applyEddt},'%Y%m%d%H%i%S')
-		  , #{regNo}
-		  , NOW()
-		  , #{updNo}
-		  , NOW()
-		)
-	</insert>
-	
-	<!-- 상품 타이틀 수정 -->
-	<update id="updateGoodTnm" parameterType="Goods">
-		/* TsaGoods.updateGoodTnm */
-		UPDATE TB_GOODS
-		SET GOODS_TNM = #{goodsTnm}
-		  , UPD_NO = #{updNo} 
-		  , UPD_DT = NOW()
-		WHERE GOODS_CD = #{goodsCd}
-	</update >
-	
-	<!-- 상품 타이틀 예약 삭제 -->
-	<delete id="deleteGoodTnmRes" parameterType="GoodsTnmRes">
-		/* TsaGoods.deleteGoodTnmRes */
-		DELETE FROM TB_GOODS_TNM_RES 
-		WHERE GOODS_TNM_RES_SQ = #{goodsTnmResSq}
-	</delete>
-	
-	<!-- 상품 타이틀 예약건 초기화 -->
-	<update id="updateGoodTnmInit" parameterType="Goods">
-		/* TsaGoods.updateGoodTnmInit */
-		UPDATE TB_GOODS
-		SET UPD_NO = #{updNo} 
-		  , UPD_DT = NOW()
-		  , GOODS_TNM = (SELECT S.GOODS_TNM
-		                 FROM (
-		                       SELECT GT.GOODS_CD
-		                            , GT.GOODS_TNM
-		                            , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_TNM_RES_SQ DESC) RANK 
-		                       FROM TB_GOODS_TNM_RES GT
-		                       WHERE GT.APPLYC_YN = 'N'
-		                       AND NOW() BETWEEN GT.APPLY_STDT AND GT.APPLY_EDDT
-		                       AND GT.GOODS_CD  = #{goodsCd}
-		                      ) S
-		                 WHERE S.RANK = 1
-		                 )
-		WHERE GOODS_CD = #{goodsCd}
-	</update >
-	
-	<!-- 상품 타이틀 예약건 초기화 조회 -->
-	<select id="getGoodTnmInit" parameterType="Goods"  resultType="Goods">
-		/* TsaGoods.getGoodTnmInit */
-		SELECT GOODS_CD
-		     , GOODS_TNM
-		     , (SELECT S.GOODS_TNM
-		        FROM (
-		              SELECT GT.GOODS_CD
-		                   , GT.GOODS_TNM
-		                   , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_TNM_RES_SQ DESC) RANK 
-		              FROM TB_GOODS_TNM_RES GT
-		              WHERE GT.APPLYC_YN = 'N'
-		              AND NOW() BETWEEN GT.APPLY_STDT AND GT.APPLY_EDDT
-		              AND GT.GOODS_CD  = #{goodsCd}
-		             ) S
-		        WHERE S.RANK = 1
-		        ) AS GOOD_TNM_INIT
-		FROM TB_GOODS
-		WHERE GOODS_CD = #{goodsCd}
-	</select>
-	
-	<!-- 네이버 EP 제외 상품 목록 건수 -->
-	<select id="getGoodsEpSkipCount" parameterType="GoodsSearch" resultType="int">
-		/* TsaGoods.getGoodsEpSkipCount */
-		SELECT COUNT(*) AS TOTCNT
-		FROM TB_GOODS G
-		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
-		INNER JOIN TB_GOODS_EP_SKIP GE ON G.GOODS_CD = GE.GOODS_CD
-		<if test="searchGb == null or searchGb =='BASIC'" >
-		<if test="applyStdt != null and applyStdt != ''">
-		                               AND GE.APPLY_EDDT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
-		</if>
-		<if test="applyEddt != null and applyEddt != ''">
-		<![CDATA[
-		                               AND GE.APPLY_STDT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-		]]>
-		</if>
-		<if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
-		                               AND GE.APPLY_EDDT >= NOW() 
-		</if>
-		</if>
-		<if test="searchGb != null and searchGb =='EXCEL'">
-		INNER JOIN (
-		    SELECT SEARCH_CD
-		         , TMP_DISP_ORD
-		    FROM (
-		          SELECT SEARCH_CD
-		               , MIN(DISP_ORD) AS TMP_DISP_ORD
-		          FROM TB_SEARCH_DATA
-		          WHERE REG_NO = #{regNo}
-		          GROUP BY SEARCH_CD) T
-		  ) SD
-		  ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
-		       OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
-		       <if test="mdNo != null and mdNo > 0">
-		       AND G.BRAND_CD IN (
-		                          SELECT DISTINCT BRAND_CD
-		                          FROM TB_BRAND_MD
-		                          WHERE MD_NO = #{mdNo}
-		                          )
-		      </if>
-		   )
-		</if>
-		WHERE 1=1
-		<if test="searchGb == null or searchGb =='BASIC'" >
-		<include refid="getGoodsListCondition_sql"/>
-		</if>
-	</select>
-
-	<!-- 네이버 EP 제외 상품 목록 -->
-	<select id="getGoodsEpSkipList" parameterType="GoodsSearch" resultType="GoodsEpSkip">
-		/* TsaGoods.getGoodsEpSkipList */
-		SELECT Z.*
-		FROM (
-		    SELECT A.*, @rownum := @rownum + 1 AS RNUM FROM (
-		        SELECT
-		                G.GOODS_CD
-		              , B.BRAND_ENM
-		              , G.BRAND_CD
-		              , G.SUPPLY_COMP_CD
-		              , G.SUPPLY_GOODS_CD
-		              , G.GOODS_NM
-		              , G.GOODS_STAT
-		              , GE.GOODS_EP_SKIP_SQ
-		              , DATE_FORMAT(GE.APPLY_STDT,'%Y%m%d%H%i%S') AS APPLY_STDT
-		              , DATE_FORMAT(GE.APPLY_EDDT,'%Y%m%d%H%i%S') AS APPLY_EDDT
-		              , GE.REG_NO
-		              , FN_GET_USER_NM(GE.REG_NO) AS REG_NM
-		              , DATE_FORMAT(GE.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-		              , GE.UPD_NO
-		              , FN_GET_USER_NM(GE.UPD_NO) AS UPD_NM
-		              , DATE_FORMAT(GE.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		        FROM TB_GOODS G
-		        JOIN ( SELECT @rownum := 0) R
-		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
-		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
-		        INNER JOIN TB_GOODS_EP_SKIP GE ON G.GOODS_CD = GE.GOODS_CD
-		        <if test="searchGb == null or searchGb =='BASIC'" >
-		            <if test="applyStdt != null and applyStdt != ''">
-		                                       AND GE.APPLY_EDDT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
-		            </if>
-		            <if test="applyEddt != null and applyEddt != ''">
-		            <![CDATA[
-		                                       AND GE.APPLY_STDT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-		            ]]>
-		            </if>
-		            <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
-		                                       AND GE.APPLY_EDDT >= NOW() 
-		            </if>
-		        </if>
-		        <if test="searchGb != null and searchGb =='EXCEL'">
-		        INNER JOIN (
-		                    SELECT SEARCH_CD
-		                         , TMP_DISP_ORD
-		                    FROM (
-		                          SELECT SEARCH_CD
-		                               , MIN(DISP_ORD) AS TMP_DISP_ORD
-		                          FROM TB_SEARCH_DATA
-		                          WHERE REG_NO = #{regNo}
-		                          GROUP BY SEARCH_CD) T
-		                  ) SD
-		                  ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
-		                       OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
-		                       <if test="mdNo != null and mdNo > 0">
-		                      AND G.BRAND_CD IN (
-		                                          SELECT DISTINCT BRAND_CD
-		                                          FROM TB_BRAND_MD
-		                                          WHERE MD_NO = #{mdNo}
-		                                          )
-		                      </if>
-		                   )
-		        </if>
-		        WHERE 1=1
-		        <if test="searchGb == null or searchGb =='BASIC'">
-		        <include refid="getGoodsListCondition_sql"/>
-		        ORDER BY GE.APPLY_STDT DESC, GE.APPLY_EDDT DESC, G.GOODS_CD, GE.GOODS_EP_SKIP_SQ
-		        </if>
-		         <if test="searchGb != null and searchGb =='EXCEL'">
-		        ORDER BY SD.TMP_DISP_ORD
-		        </if>
-		<include refid="getListPagingCondition_sql"/>
-	</select>
-
-	<!-- 네이버 EP 제외 상품 조회(기간 체크용) -->
-	<select id="getGoodsEpSkipDupChkCount" parameterType="GoodsEpSkip" resultType="int">
-		/* TsaGoods.getGoodsEpSkipDupChkCount */
-		SELECT COUNT(GOODS_CD)
-		FROM TB_GOODS_EP_SKIP
-		WHERE 1=1
-		<![CDATA[
-		AND APPLY_STDT <= DATE_FORMAT(#{applyStdt}, '%Y%m%d')
-		]]>
-		AND APPLY_EDDT >= DATE_FORMAT(#{applyEddt},'%Y%m%d%')
-		AND GOODS_CD = #{goodsCd}
-	</select>
-
-	<!-- 네이버 EP 제외 상품 예약 등록 -->
-	<insert id="createGoodEpSkip" parameterType="GoodsEpSkip">
-		/* TsaGoods.createGoodEpSkip */
-		INSERT INTO TB_GOODS_EP_SKIP (
-		GOODS_EP_SKIP_SQ
-		, GOODS_CD
-		, APPLY_STDT
-		, APPLY_EDDT
-		, REG_NO
-		, REG_DT
-		, UPD_NO
-		, UPD_DT
-		)
-		VALUES(
-		  NULL
-		, #{goodsCd}
-		, STR_TO_DATE(#{applyStdt},'%Y%m%d%H%i%S')
-		, STR_TO_DATE(#{applyEddt},'%Y%m%d%H%i%S')
-		, #{regNo}
-		, NOW()
-		, #{updNo}
-		, NOW()
-		)
-	</insert>
-
-	<!-- 네이버 EP 제외 상품 예약 삭제 -->
-	<delete id="deleteGoodEpSkip" parameterType="GoodsEpSkip">
-		/* TsaGoods.deleteGoodEpSkip */
-		DELETE FROM TB_GOODS_EP_SKIP
-		WHERE GOODS_EP_SKIP_SQ = #{goodsEpSkipSq}
-	</delete>
-	
-	<!-- 상품상세 공지사항 목록 -->
-	<select id="getNoticeList" parameterType="GoodsSearch" resultType="Notice">
-		/* TsaGoods.getNoticeList */
-		SELECT A.NOTICE_SQ                                  
-		     , A.NOTICE_TYPE                                
-		     , A.NOTICE_TITLE                               
-		     , A.NOTICE_CONTENT                             
-		     , DATE_FORMAT(A.NOTICE_STDT,'%Y-%m-%d')  AS NOTICE_STDT 
-		     , DATE_FORMAT(A.NOTICE_EDDT,'%Y-%m-%d')  AS NOTICE_EDDT 
-		     , A.USE_YN                                          
-		     , FN_GET_USER_NM(A.REG_NO)             AS REG_NM    
-		     , DATE_FORMAT(A.REG_DT,'%Y-%m-%d %H:%i:%S') AS REG_DT
-		     , FN_GET_USER_NM(A.UPD_NO)             AS UPD_NM    
-		     , DATE_FORMAT(A.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT    
-		FROM   TB_NOTICE A
-		WHERE  A.NOTICE_TYPE = 'G047_30'
-		<if test="stDate != null and stDate !=''">
-		AND A.NOTICE_EDDT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
-		</if>
-		<if test="edDate != null and edDate !=''">
-		<![CDATA[
-		AND A.NOTICE_STDT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
-		]]>
-		</if>
-		<if test='useYn != null and useYn !=""'>
-		AND A.USE_YN = #{useYn}
-		</if>
-		<if test="noticeTitle != null and noticeTitle !=''">
-		AND LOWER(A.NOTICE_TITLE) LIKE CONCAT('%',LOWER(#{noticeTitle}),'%')
-		</if>
-		<if test='conditionList != null and conditionList.length>0'>
-		AND A.NOTICE_SQ IN (
-		                    SELECT NOTICE_SQ
-		                    FROM TB_NOTICE_GOODS
-		                    WHERE GOODS_CD IN (
-		                                       SELECT GOODS_CD 
-		                                       FROM TB_GOODS G
-		                                       WHERE 1 = 1
-		                                       AND (
-		    <choose>
-		      <when test='search != null and search == "searchGoodsCd"'>
-		          <foreach collection="conditionList" item="item" index="index" separator="or">
-		       UPPER(G.GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%') 
-		          </foreach>
-		      </when>
-		      <when test='search != null and search == "searchGoodsNm"'>
-		          <foreach collection="conditionList" item="item" index="index" separator="or">
-		       UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{item}),'%')
-		          </foreach>
-		      </when>
-		      <when test='search != null and search == "searchGoodsNum"'>
-		          <foreach collection="conditionList" item="item" index="index" separator="or">
-		       UPPER(G.GOODS_NUM) LIKE CONCAT('%',UPPER(#{item}),'%')
-		          </foreach>
-		      </when>
-		      <when test='search != null and search == "searchSupplyGoodsCd"'>
-		          <foreach collection="conditionList" item="item" index="index" separator="or">
-		       UPPER(G.SUPPLY_GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%')
-		          </foreach>
-		      </when>
-		    </choose>
-		                                            )
-		                                      )
-		                   )
-		</if>
-		<if test="supplyCompCd != null and supplyCompCd  != ''">
-		AND A.NOTICE_SQ IN (
-		                    SELECT NOTICE_SQ
-		                    FROM TB_NOTICE_GOODS
-		                    WHERE GOODS_CD IN (
-		                                       SELECT GOODS_CD 
-		                                       FROM TB_GOODS 
-		                                       WHERE SUPPLY_COMP_CD = #{supplyCompCd}
-		                                       <if test="brandCd != null and brandCd  != ''">
-		                                       AND BRAND_CD = #{brandCd} 
-		                                       </if>
-		                                      )
-		                   )
-		</if>
-		ORDER  BY A.NOTICE_SQ DESC
-	</select>
-	
-	<!-- 상품상세 공지사항 상품 목록 -->
-	<select id="getNoticeGoodsList" parameterType="Notice" resultType="NoticeGoods">
-		/* TsaGoods.getNoticeGoodsList */
-		SELECT A.NOTICE_SQ
-		     , A.GOODS_CD
-		     , B.GOODS_NM
-		FROM TB_NOTICE_GOODS A
-		INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
-		WHERE NOTICE_SQ = #{noticeSq}
-		ORDER BY A.GOODS_CD
-	</select>
-	
-	<!-- 상품상세 공지사항 상품저장 -->
-	<insert id="saveNoticeGoods" parameterType="NoticeGoods">
-		/* TsaGoods.saveNoticeGoods */
-		INSERT INTO TB_NOTICE_GOODS (
-		       NOTICE_SQ
-		     , GOODS_CD
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{noticeSq}
-		     , #{goodsCd}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       GOODS_CD = #{goodsCd}
-	</insert>
-	
-	<!-- 상품상세 공지사항 상품 삭제 -->
-	<delete id="deleteNoticeGoods" parameterType="NoticeGoods">
-		/* TsaGoods.deleteNoticeGoods */
-		DELETE FROM TB_NOTICE_GOODS 
-		WHERE NOICE_SQ =  #{noiceSq}
-		AND GOODS_CD = #{goodsCd}
-	</delete>
-	
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaGoodsDao">
+
+	<!-- 품목 목록 -->
+	<select id="getItemkindList" parameterType="Itemkind" resultType="Itemkind">
+		/* TsaGoods.getItemkindList */
+		SELECT ITEMKIND_CD
+		     , ITEMKIND_NM
+		     /* , ITEMKIND_ENM*/
+		     , NI_CLSF_CD
+		     , USE_YN
+		FROM TB_ITEMKIND
+		WHERE 1 = 1
+		<if test="itemkindCd != null and itemkindCd != ''">
+		AND ITEMKIND_CD = #{itemkindCd} 
+		</if>
+		<if test="useYn != null and useYn != ''">
+		AND USE_YN = #{useYn} 
+		</if>
+		ORDER BY ITEMKIND_CD
+	</select>
+
+	<!-- 품목 등록/저장 -->
+	<insert id="saveItemkindInfo" parameterType="Itemkind">
+		/* TsaGoods.saveItemkindInfo */
+		INSERT INTO TB_ITEMKIND (
+		       ITEMKIND_CD
+		     , ITEMKIND_NM
+		     , NI_CLSF_CD
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{itemkindCd}
+		     , #{itemkindNm}
+		     , #{niClsfCd}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       ITEMKIND_NM = #{itemkindNm}
+		     , NI_CLSF_CD = #{niClsfCd}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 품목 삭제 -->
+	<delete id="deleteItemkindInfo" parameterType="Itemkind">
+		/* TsaGoods.deleteItemkindInfo */
+		DELETE FROM TB_ITEMKIND
+		 WHERE ITEMKIND_CD = #{itemkindCd}
+	</delete>
+	
+	<!-- 색상 조회 -->
+	<select id="getColorList" parameterType="Color" resultType="Color" >
+		/* TsaGoods.getColorList */
+		SELECT COLOR_CD
+		     , COLOR_ENM
+		     , COLOR_KNM
+		     , COLOR_FILE
+		     , COLOR_GRP_NM
+		     , USE_YN
+		     , FN_GET_USER_NM(REG_NO) AS REG_NM
+		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO) AS UPD_NM
+		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		     , COLOR_GRP_CD
+		FROM TB_COLOR
+		WHERE 1 = 1
+		<if test='colorCd != null and colorCd != ""'>
+		AND COLOR_CD = #{colorCd}
+		</if>
+		<if test='useYn != null and useYn != ""'>
+		AND USE_YN = #{useYn}
+		</if>
+		ORDER BY COLOR_CD
+	</select>
+	
+	<!-- 색상 저장 -->
+	<update id="saveColor" parameterType="Color">
+		/* TsaGoods.saveColor */
+		INSERT INTO TB_COLOR (
+		       COLOR_CD
+		     , COLOR_ENM
+		     , COLOR_KNM
+		     , COLOR_FILE
+		     , COLOR_GRP_NM
+		     , COLOR_GRP_CD
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{colorCd}
+		     , #{colorEnm}
+		     , #{colorKnm}
+		     , #{colorFile}
+		     , #{colorGrpNm}
+		     , #{colorGrpCd}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       COLOR_ENM = #{colorEnm}
+		     , COLOR_KNM = #{colorKnm}
+		     , COLOR_FILE = UPPER(#{colorFile})
+		     , COLOR_GRP_NM = UPPER(#{colorGrpNm})
+		     , COLOR_GRP_CD = UPPER(#{colorGrpCd})
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</update>
+	
+	<!-- 정보고시분류 목록 -->
+	<select id="getNotiInfoList" parameterType="NotiInfo" resultType="NotiInfo">
+		/* TsaGoods.getNotiInfoList */
+		SELECT DISTINCT B.SUPPLY_COMP_CD
+		     , B.NI_CLSF_CD
+		     , C.CD_NM AS NI_CLSF_NM
+		     , C.DISP_ORD
+		FROM TB_NOTI_INFO B
+		INNER JOIN TB_COMMON_CODE C ON B.NI_CLSF_CD = C.CD 
+		WHERE B.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
+		                         WHEN 'S0001' THEN 'S0001'
+		                         WHEN 'S0002' THEN 'S0002'
+		                         ELSE 'E' END 
+		AND C.CD_GB = 'G004'   /*고시정보*/
+		ORDER BY C.DISP_ORD
+	</select>
+	
+	<!-- 정보고시 상세 목록 -->
+	<select id="getNotiInfoItemList" parameterType="NotiInfo" resultType="NotiInfo">
+		/* TsaGoods.getNotiInfoItemList */
+		SELECT B.SUPPLY_COMP_CD
+		     , B.NI_CLSF_CD
+		     , B.NI_ITEM_CD
+		     , FN_GET_CODE_NM('G005', B.NI_ITEM_CD) AS NI_ITEM_NM
+		     , B.NI_CONTENT
+		     , B.DISP_ORD
+		     , B.REQ_YN
+		     , B.DISP_YN
+		FROM TB_NOTI_INFO B
+		WHERE B.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
+		                         WHEN 'S0001' THEN 'S0001'
+		                         WHEN 'S0002' THEN 'S0002'
+		                         ELSE 'E' END 
+		<if test="niClsfCd != null and niClsfCd != ''">
+		AND B.NI_CLSF_CD = #{niClsfCd}
+		</if>
+		ORDER BY B.NI_CLSF_CD, B.DISP_ORD
+	</select>
+
+	<!-- 정보고시 항목 등록 -->
+	<insert id="saveNotiInfo" parameterType="NotiInfo">
+		/* TsaGoods.saveNotiInfo */
+		INSERT INTO TB_NOTI_INFO (
+		       SUPPLY_COMP_CD
+		     , NI_CLSF_CD
+		     , NI_ITEM_CD
+		     , NI_CONTENT
+		     , DISP_ORD
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{supplyCompCd}
+		     , #{niClsfCd}
+		     , #{niItemCd}
+		     , #{niContent}
+		     , #{dispOrd}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       NI_CONTENT = #{niContent}
+		     , DISP_ORD = #{dispOrd}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 상품 목록 건수 -->
+	<select id="getGoodsListCount" parameterType="GoodsSearch" resultType="int">
+		/* TsaGoods.getGoodsListCount */
+		        SELECT COUNT(*) AS TOTCNT
+		        FROM TB_GOODS G
+		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		        INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
+		        <if test="searchGb != null and searchGb =='EXTEND'">
+		        INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.EXTEND_GOODS_CD
+		                                      AND GE.GOODS_CD IN
+		            <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
+		                                          UPPER(#{item})
+		            </foreach>
+		        </if>
+		        <if test="searchGb != null and searchGb =='MASTER'">
+		        INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.GOODS_CD
+		                                      AND GE.EXTEND_GOODS_CD IN
+		            <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
+		                                          UPPER(#{item})
+		            </foreach>
+		        </if>
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        INNER JOIN (
+		                     SELECT SEARCH_CD
+		                          , TMP_DISP_ORD
+		                     FROM (
+		                           SELECT SEARCH_CD
+		                                , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                           FROM TB_SEARCH_DATA
+		                           WHERE REG_NO = #{regNo}
+		                           GROUP BY SEARCH_CD) T
+		                   ) SD
+		                   ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		                        OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		                        <if test="mdNo != null and mdNo > 0">
+		                        AND G.BRAND_CD IN (
+		                                           SELECT DISTINCT BRAND_CD
+		                                           FROM TB_BRAND_MD
+		                                           WHERE MD_NO = #{mdNo}
+		                                           )
+		                       </if>
+		                   )
+		        </if>
+		        LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
+		        WHERE 1=1
+		        <if test="searchGb == null or searchGb =='BASIC' or searchGb =='EXTEND' or searchGb =='MASTER'" >
+		        <include refid="getGoodsListCondition_sql"/>
+		        </if>
+	</select>
+
+	<!-- 상품 목록 -->
+	<select id="getGoodsList" parameterType="GoodsSearch" resultType="Goods">
+		/* TsaGoods.getGoodsList */
+		SELECT Z.*
+		    /*, (CASE WHEN Z.GOODS_TYPE = 'N' THEN (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = Z.GOODS_CD) 
+		            ELSE (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_EXTEND WHERE GOODS_CD = Z.GOODS_CD) 
+		            END) AS STOCK_QTY_SUM */
+		    , 0 AS STOCK_QTY_SUM
+		    , (SELECT ITEMKIND_NM FROM TB_ITEMKIND WHERE ITEMKIND_CD = Z.ITEMKIND_CD ) AS ITEMKIND_NM
+		    , FN_GET_USER_NM(REG_NO) AS REG_NM
+		    , FN_GET_USER_NM(UPD_NO) AS UPD_NM
+		FROM (
+		    SELECT A.*, @rownum := @rownum + 1 AS RNUM FROM (
+		        SELECT
+		                G.GOODS_CD
+		              , G.GOODS_TYPE
+		              , B.BRAND_ENM
+		              , B.BRAND_GRP_NM
+		              , G.BRAND_CD
+		              , G.ITEMKIND_CD
+		              , G.SUPPLY_COMP_CD
+		              , G.SUPPLY_GOODS_CD
+		              , G.GOODS_NUM
+		              , G.GOODS_NM
+		              , G.GOODS_STAT
+		              , G.LIST_PRICE
+		              , G.CURR_PRICE
+		              , G.DC_RATE
+		              , G.SELF_GOODS_YN
+		              , G.SELF_MALL_YN
+		              , G.FORMAL_GB
+		              , G.STYLE_YEAR
+		              , G.SEASON_CD
+		              , G.ERP_STOCK_LINK_YN
+		              , G.ERP_PRICE_LINK_YN
+		              , G.CHANGEABLE_YN
+		              , G.RETURNABLE_YN
+		              , DATE_FORMAT(G.FRST_CFRM_DT, '%Y%m%d%H%i%S') AS FRST_CFRM_DT
+		              , G.SELL_FEE_RATE
+		              , DATE_FORMAT(G.PRICE_UPD_DT,'%Y%m%d%H%i%S') AS PRICE_UPD_DT
+		              , CASE WHEN IMG_PATH1 IS NULL THEN
+		                     'N'
+		                ELSE
+		                     'Y'
+		                END AS GOODS_IMAGE_YN
+		              , GI.IMG_PATH1
+		              , GI.IMG_PATH6
+		              , GI.IMG_TYPE
+		              , G.REG_NO
+		              , DATE_FORMAT(G.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		              , G.UPD_NO
+		              , DATE_FORMAT(G.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		              , GS.SELL_DAY15_QTY
+		              <choose>
+		                  <when test="searchGb != null and searchGb =='EXCEL'">
+		              , SD.TMP_DISP_ORD
+		                  </when>
+		                  <otherwise>
+		              , 0 AS TMP_DISP_ORD
+		                  </otherwise>
+		              </choose>
+		        FROM TB_GOODS G
+		        JOIN ( SELECT @rownum := 0) R
+		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		        INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
+		        <if test="searchGb != null and searchGb =='EXTEND'">
+		        INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.EXTEND_GOODS_CD
+		                                      AND GE.GOODS_CD IN
+		            <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
+		                                          UPPER(#{item})
+		            </foreach>
+		        </if>
+		        <if test="searchGb != null and searchGb =='MASTER'">
+		        INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.GOODS_CD
+		                                      AND GE.EXTEND_GOODS_CD IN
+		            <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
+		                                          UPPER(#{item})
+		            </foreach>
+		        </if>
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        INNER JOIN (
+		                     SELECT SEARCH_CD
+		                          , TMP_DISP_ORD
+		                     FROM (
+		                           SELECT SEARCH_CD
+		                                , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                           FROM TB_SEARCH_DATA
+		                           WHERE REG_NO = #{regNo}
+		                           GROUP BY SEARCH_CD) T
+		                   ) SD
+		                   ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		                        OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		                        <if test="mdNo != null and mdNo > 0">
+		                        AND G.BRAND_CD IN (
+		                                           SELECT DISTINCT BRAND_CD
+		                                           FROM TB_BRAND_MD
+		                                           WHERE MD_NO = #{mdNo}
+		                                           )
+		                       </if>
+		                   )
+		        </if>
+		        LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
+		        WHERE 1=1
+		        <if test="searchGb == null or searchGb =='BASIC' or searchGb =='EXTEND' or searchGb =='MASTER'" >
+		        <include refid="getGoodsListCondition_sql"/>
+		        ORDER BY G.REG_DT DESC, G.GOODS_CD
+		        </if>
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        ORDER BY SD.TMP_DISP_ORD
+		        </if>
+		<include refid="getListPagingCondition_sql"/>
+	</select>
+	
+	<!-- 상품 목록 조건 정보 -->
+	<sql id="getGoodsListCondition_sql">
+		        <if test='conditionList != null and conditionList.length>0'>
+		            <choose>
+		              <when test='search != null and search == "searchGoodsCd"'>
+		        AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               UPPER(G.GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%') 
+		              </foreach>
+		             )
+		              </when>
+		              <when test='search != null and search == "searchGoodsNum"'>
+		        AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               UPPER(G.GOODS_NUM) LIKE CONCAT('%',UPPER(#{item}),'%')
+		              </foreach>
+		             )
+		              </when>
+		              <when test='search != null and search == "searchSupplyGoodsCd"'>
+		        AND (
+		              <foreach collection="conditionList" item="item" index="index" separator="or">
+		               UPPER(G.SUPPLY_GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%')
+		              </foreach>
+		             )
+		              </when>
+		              <when test='search != null and search == "searchExtendGoodsCd"'>
+		        AND 1 = 1
+		              </when>
+		              <when test='search != null and search == "searchMasterGoodsCd"'>
+		        AND 1 = 1
+		              </when>
+		              <otherwise>
+		        AND UPPER(G.REG_ID) LIKE CONCAT('%',UPPER(#{item}),'%')
+		              </otherwise>
+		            </choose>
+		        </if>
+		        <if test="goodsCd != null and goodsCd != ''">
+		        AND UPPER(G.GOODS_CD) LIKE CONCAT('%',UPPER(#{goodsCd}),'%')
+		        </if>
+		         <if test="goodsNm != null and goodsNm != ''">
+		        AND UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{goodsNm}),'%')
+		        </if>
+		        <if test="goodsType != null and goodsType != ''">
+		        AND G.GOODS_TYPE = #{goodsType}
+		        </if>
+		        <if test="supplyCompCd != null and supplyCompCd != ''">
+		        AND G.SUPPLY_COMP_CD = #{supplyCompCd}
+		        </if>
+		        <if test="brandCd != null and brandCd != ''">
+		        AND G.BRAND_CD = #{brandCd}
+		        </if>
+		        <if test="multiBrand != null and multiBrand != ''">
+		        AND G.BRAND_CD IN
+		            <foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
+		        #{item}
+		            </foreach>
+		        </if>
+		        <if test="selfMallYn != null and selfMallYn != ''">
+		        AND G.SELF_MALL_YN = #{selfMallYn}
+		        </if>
+		        <if test="itemkindCd != null and itemkindCd != ''">
+		        AND G.ITEMKIND_CD = #{itemkindCd}
+		        </if>
+		        <if test="multiItemkindCd != null and multiItemkindCd != ''">
+		        AND G.ITEMKIND_CD IN
+		            <foreach collection="multiItemkindCd" item="item" index="index"  open="(" close=")" separator=",">
+		        #{item}
+		            </foreach>
+		        </if>
+		        <if test="goodsStat != null and goodsStat != ''">
+		        AND G.GOODS_STAT = #{goodsStat}
+		        </if>
+		        <if test="multiGoodsStat != null and multiGoodsStat != ''">
+		        AND G.GOODS_STAT IN
+		            <foreach collection="multiGoodsStat" item="item" index="index"  open="(" close=")" separator=",">
+		        #{item}
+		            </foreach>
+		        </if>
+		        <if test="styleYear != null and styleYear != ''">
+		        AND G.STYLE_YEAR = (SELECT CD_NM FROM TB_COMMON_CODE WHERE CD = #{styleYear} AND CD_GB='G023')
+		        </if>
+		        <if test="multiStyleYear != null and multiStyleYear != ''">
+		        AND G.STYLE_YEAR IN (SELECT CD_NM 
+		                             FROM TB_COMMON_CODE 
+		                             WHERE CD_GB='G023' 
+		                             AND CD IN 
+		                             <foreach collection="multiStyleYear" item="item" index="index"  open="(" close=")" separator=",">
+		                             #{item}
+		                             </foreach>
+		                             )
+		        </if>
+		        <if test="seasonCd != null and seasonCd != ''">
+		        AND G.SEASON_CD = #{seasonCd}
+		        </if>
+		        <if test="multiSeasonCd != null and multiSeasonCd != ''">
+		        AND G.SEASON_CD IN
+		            <foreach collection="multiSeasonCd" item="item" index="index"  open="(" close=")" separator=",">
+		        #{item}
+		            </foreach>
+		        </if>
+		        <if test="sexGb != null and sexGb != ''">
+		        AND G.SEX_GB = #{sexGb}
+		        </if>
+		        <if test="changeableYn != null and changeableYn != ''">
+		        AND G.CHANGEABLE_YN = #{changeableYn}
+		        </if>
+		        <if test="returnableYn != null and returnableYn != ''">
+		        AND G.RETURNABLE_YN = #{returnableYn}
+		        </if>
+		        <if test="returnFeeFreeYn != null and returnFeeFreeYn != ''">
+		        AND G.RETURN_FEE_FREE_YN = #{returnFeeFreeYn}
+		        </if>
+		        <if test="changeFeeFreeYn != null and changeFeeFreeYn != ''">
+		        AND G.CHANGE_FEE_FREE_YN = #{changeFeeFreeYn}
+		        </if>
+		        <if test="formalGb != null and formalGb != ''">
+		        AND G.FORMAL_GB = #{formalGb}
+		        </if>
+		        <if test='soldOutYn != null and soldOutYn == "Y"'>
+		        AND EXISTS (
+		                    SELECT GOODS_CD 
+		                    FROM VW_STOCK
+		                    WHERE SOLDOUT_YN = 'Y'
+		                    AND GOODS_CD = G.GOODS_CD
+		                   )
+		        </if>
+		        <if test='soldOutYn != null and soldOutYn == "N"'>
+		        AND NOT EXISTS (
+		                    SELECT GOODS_CD 
+		                    FROM VW_STOCK
+		                    WHERE SOLDOUT_YN = 'Y'
+		                    AND GOODS_CD = G.GOODS_CD
+		                   )
+		        </if>
+		        <if test="erpStockLinkYn != null and erpStockLinkYn != ''">
+		        AND G.ERP_STOCK_LINK_YN = #{erpStockLinkYn}
+		        </if>
+		        <if test="erpPriceLinkYn != null and erpPriceLinkYn != ''">
+		        AND G.ERP_PRICE_LINK_YN = #{erpPriceLinkYn}
+		        </if>
+		        <if test="mdNo != null and mdNo > 0">
+		        AND G.BRAND_CD IN (
+		            SELECT DISTINCT BRAND_CD
+		            FROM   TB_BRAND_MD
+		            WHERE  MD_NO = #{mdNo}
+		        )
+		        </if>
+		        <if test="currPriceSt != null and currPriceSt != ''">
+		        AND G.CURR_PRICE >= #{currPriceSt}
+		        </if>
+		        <if test="currPriceEd != null and currPriceEd != ''">
+		        <![CDATA[
+		        AND G.CURR_PRICE <= #{currPriceEd}
+		         ]]>
+		        </if>
+		        <if test="dcRateSt != null and dcRateSt != ''">
+		        AND G.DC_RATE >= #{dcRateSt}
+		        </if>
+		        <if test="dcRateEd != null and dcRateEd != ''">
+		        <![CDATA[
+		        AND G.DC_RATE <= #{dcRateEd}
+		        ]]>
+		        </if>
+		        <if test='dateGbn != null and dateGbn == "P"'>
+		            <if test="stDate != null and stDate != ''">
+		        AND G.PRICE_UPD_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		            </if>
+		            <if test="edDate != null and edDate != ''">
+		            <![CDATA[
+		        AND G.PRICE_UPD_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		            ]]>
+		            </if>
+		        </if>
+		        <if test='dateGbn != null and dateGbn == "R"'>
+		            <if test="stDate != null and stDate != ''">
+		        AND G.REG_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		            </if>
+		            <if test="edDate != null and edDate != ''">
+		            <![CDATA[
+		        AND G.REG_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		            ]]>
+		            </if>
+		        </if>
+		        <if test='dateGbn != null and dateGbn == "S"'>
+		            <if test="stDate != null and stDate != ''">
+		        AND G.APPR_UPD_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		            </if>
+		            <if test="edDate != null and edDate != ''">
+		            <![CDATA[
+		        AND G.APPR_UPD_DT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		            ]]>
+		            </if>
+		        </if>
+		        <if test="stockQtySt != null and stockQtySt != ''">
+		        AND ST.CURR_STOCK_QTY >= #{stockQtySt}
+		        </if>
+		        <if test="stockQtyEd != null and stockQtyEd != ''">
+		        <![CDATA[
+		        AND ST.CURR_STOCK_QTY <= #{stockQtyEd}
+		        ]]>
+		        </if>
+		        <if test="ageGrpCd != null and ageGrpCd != ''">
+		        AND G.AGE_GRP_CD = #{ageGrpCd}
+		        </if>
+		        <if test="cateCd != null and cateCd != ''">
+		        AND G.GOODS_CD IN (
+		            SELECT GOODS_CD
+		            FROM   TB_CATEGORY_GOODS
+		            WHERE  CATE_CD = #{cateCd}
+		        )
+		        </if>
+	</sql>
+	
+	<!-- 목록 페이징 정보 -->
+	<sql id="getListPagingCondition_sql">
+		<choose>
+		<when test="pageable != null">
+		    ) A
+		)Z WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
+		</when>
+		<otherwise>
+		    ) A
+		)Z
+		</otherwise>
+		</choose>
+	</sql>
+	
+	<!-- 상품 목록 기본정보 엑셀  -->
+	<select id="getGoodsInfoExcelList" parameterType="GoodsSearch" resultType="paramMap">
+		/* TsaGoods.getGoodsInfoExcelList */
+		SELECT G.GOODS_CD
+		     , B.BRAND_ENM
+		     , B.BRAND_GRP_NM
+		     , G.BRAND_CD
+		     , G.ITEMKIND_CD
+		     , (SELECT SUPPLY_COMP_NM FROM TB_SUPPLY_COMPANY WHERE SUPPLY_COMP_CD = G.SUPPLY_COMP_CD) AS SUPPLY_COMP_CD
+		     , G.SUPPLY_GOODS_CD
+		     , G.GOODS_NUM
+		     , G.GOODS_NM
+		     , G.GOODS_TYPE
+		     , FN_GET_CODE_NM('G008', G.GOODS_STAT) AS GOODS_STAT
+		     , G.LIST_PRICE
+		     , G.CURR_PRICE
+		     , G.DC_RATE
+		     , G.SELF_GOODS_YN
+		     , FN_GET_CODE_NM('G009', G.FORMAL_GB) AS FORMAL_GB
+		     , G.STYLE_YEAR
+		     , FN_GET_CODE_NM('G006', G.SEASON_CD) AS SEASON_CD
+		     , G.ERP_STOCK_LINK_YN
+		     , G.CHANGEABLE_YN
+		     , G.RETURNABLE_YN
+		     , G.SELL_FEE_RATE
+		     , DATE_FORMAT(G.PRICE_UPD_DT, '%Y-%m-%d %H:%i:%S') AS PRICE_UPD_DT
+		     , DATE_FORMAT(G.FRST_CFRM_DT, '%Y-%m-%d %H:%i:%S') AS FRST_CFRM_DT
+		     , CASE WHEN IMG_PATH1 IS NULL THEN
+		           'N'
+		       ELSE
+		           'Y'
+		       END AS GOODS_IMAGE_YN
+		     /*, (CASE WHEN G.GOODS_TYPE = 'N' THEN (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = G.GOODS_CD) 
+		             ELSE (SELECT NVL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_EXTEND WHERE GOODS_CD = G.GOODS_CD) 
+		             END) AS STOCK_QTY_SUM*/
+		     , (SELECT ITEMKIND_NM FROM TB_ITEMKIND WHERE ITEMKIND_CD = G.ITEMKIND_CD) AS ITEMKIND_NM
+		     , GI.IMG_PATH1
+		     , GI.IMG_PATH6
+		     , GI.IMG_TYPE
+		     , G.REG_NO
+		     , DATE_FORMAT(G.REG_DT, '%Y-%m-%d %H:%i:%S') AS REG_DT
+		     , G.UPD_NO
+		     , DATE_FORMAT(G.UPD_DT, '%Y-%m-%d %H:%i:%S') AS UPD_DT
+		FROM TB_GOODS G
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		INNER JOIN TB_GOODS_SUMMARY GS ON G.GOODS_CD = GS.GOODS_CD
+		<if test="searchGb != null and searchGb =='EXTEND'">
+		INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.EXTEND_GOODS_CD
+		                              AND GE.GOODS_CD IN
+		    <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
+		                              UPPER(#{item})
+		    </foreach>
+		</if>
+		<if test="searchGb != null and searchGb =='MASTER'">
+		INNER JOIN TB_GOODS_EXTEND GE ON G.GOODS_CD =  GE.GOODS_CD
+		                              AND GE.EXTEND_GOODS_CD IN
+		    <foreach collection="conditionList" item="item" index="index"  open="(" close=")" separator=",">
+		                          UPPER(#{item})
+		    </foreach>
+		</if>
+		<if test="searchGb != null and searchGb =='EXCEL'">
+		INNER JOIN (
+		             SELECT SEARCH_CD
+		                  , TMP_DISP_ORD
+		             FROM (
+		                   SELECT SEARCH_CD
+		                        , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                   FROM TB_SEARCH_DATA
+		                   WHERE REG_NO = #{regNo}
+		                   GROUP BY SEARCH_CD) T
+		          ) SD
+		           ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		                 OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		                <if test="mdNo != null and mdNo > 0">
+		                AND G.BRAND_CD IN (
+		                                   SELECT DISTINCT BRAND_CD
+		                                   FROM TB_BRAND_MD
+		                                   WHERE MD_NO = #{mdNo}
+		                                  )
+		               </if>
+		              )
+		</if>
+		LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
+		WHERE 1=1
+		<if test="searchGb == null or searchGb =='BASIC' or searchGb =='EXTEND' or searchGb =='MASTER'" >
+		<include refid="getGoodsListCondition_sql"/>
+		ORDER BY G.REG_DT DESC
+		</if>
+		<if test="searchGb == null or searchGb =='EXCEL'">
+		ORDER BY SD.TMP_DISP_ORD
+		</if>
+	</select>
+	
+	<!-- 상품 정보 -->
+	<select id="getGoods" parameterType="Goods" resultType="Goods">
+		/* TsaGoods.getGoods */
+		SELECT G.GOODS_CD
+		     , G.GOODS_NM
+		     , G.GOODS_TNM
+		     , G.GOODS_SNM
+		     , G.GOODS_SNM1
+		     , G.BRAND_CD
+		     , B.BRAND_GRP_NM
+		     , G.ITEMKIND_CD
+		     , G.STYLE_YEAR
+		     , G.SEASON_CD
+		     , G.SEX_GB
+		     , G.GOODS_NUM
+		     , G.COLOR_CD
+		     , G.MAIN_COLOR_YN
+		     , G.GOODS_TYPE
+		     , G.LIST_PRICE
+		     , G.CURR_PRICE
+		     , G.CURR_BPRICE
+		     , DATE_FORMAT(G.PRICE_UPD_DT, '%Y%m%d%H%i%S') AS PRICE_UPD_DT
+		     , G.DC_RATE
+		     , G.GOODS_STAT
+		     , G.SELF_GOODS_YN
+		     , G.SELF_MALL_YN
+		     , G.GOODS_GB
+		     , G.DISTRIBUTION_GB
+		     /*, (SELECT COLOR_GRP_FILE 
+		        FROM TB_COLOR TC 
+		        WHERE TC.COLOR_CD = G.COLOR_CD) AS COLOR_GRP_FILE */
+		     , G.SUPPLY_COMP_CD
+		     , G.SUPPLY_GOODS_CD
+		     , G.AGE_GRP_CD
+		     , G.DELV_FEE
+		     , G.MIN_ORD_AMT
+		     , G.PNT_PRATE
+		     , G.PNT_MRATE
+		     , G.SELL_FEE_RATE
+		     , G.FORMAL_GB
+		     , G.RETURNABLE_YN
+		     , G.PRE_PPNT_USABLE_YN
+		     , G.PRE_MPNT_USABLE_YN
+		     , G.MIN_ORD_QTY
+		     , G.MAX_ORD_QTY
+		     , G.DAY_MAX_ORD_QTY
+		     , G.ERP_STOCK_LINK_YN
+		     , G.ERP_PRICE_LINK_YN
+		     , G.MAKE_NM
+		     , G.MAKE_YMD
+		     , G.TAX_GB
+		     , G.GOODS_TYPE
+		     , FN_GET_CODE_NM('G056', G.GOODS_TYPE) AS GOODS_TYPE_NM
+		     , DATE_FORMAT(G.FRST_CFRM_DT, '%Y%m%d%H%i%S') AS FRST_CFRM_DT
+		     , (SELECT I.NI_CLSF_CD FROM TB_ITEMKIND I WHERE I.ITEMKIND_CD = G.ITEMKIND_CD) AS NI_CLSF_CD
+		     , GI.IMG_TYPE
+		     , GI.IMG_PATH1
+		     , GI.IMG_PATH6
+		     , CASE WHEN IMG_PATH1 IS NULL THEN
+		           'N'
+		       ELSE
+		           'Y'
+		       END AS GOODS_IMAGE_YN
+		     , (SELECT B.CD_NM 
+		       FROM TB_ITEMKIND A
+		          , TB_COMMON_CODE B 
+		       WHERE A.ITEMKIND_CD = G.ITEMKIND_CD 
+		       AND A.NI_CLSF_CD = B.CD 
+		       AND B.CD_GB = 'G004') AS  NI_CLSF_NM
+		     , FN_GET_USER_NM(G.UPD_NO) AS UPD_NM  
+		FROM TB_GOODS G
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
+		WHERE 1 = 1 
+		<choose>
+		<when test="goodsCd != null and goodsCd != ''">
+		AND G.GOODS_CD = #{goodsCd}
+		</when>
+		<otherwise>
+		AND G.SUPPLY_COMP_CD = #{supplyCompCd}
+		AND G.SUPPLY_GOODS_CD = #{supplyGoodsCd}
+		</otherwise>
+		</choose>
+	</select>
+	
+	<!-- 상품 상세 정보 조회 -->
+	<select id="getGoodsDescList" parameterType="GoodsDesc" resultType="GoodsDesc">
+		/* TsaGoods.getGoodsDescList */
+		SELECT GOODS_CD
+		     , DESC_GB
+		     , SEQ
+		     , GOODS_DESC
+		FROM TB_GOODS_DESC
+		WHERE GOODS_CD = #{goodsCd}
+		AND DESC_GB = #{descGb}
+		ORDER BY SEQ
+	</select>
+	
+	<!-- 상품 고시정보 조회 -->
+	<select id="getGoodsNotiInfoList" parameterType="GoodsNotiInfo" resultType="GoodsNotiInfo">
+		/* TsaGoods.getGoodsNotiInfoList */
+		SELECT C.GOODS_CD
+		     , C.NI_CLSF_CD
+		     , FN_GET_CODE_NM('G005', C.NI_ITEM_CD) AS NI_ITEM_NM
+		     , C.NI_ITEM_CD
+		     , C.NI_CONTENT
+		     , C.DISP_ORD
+		     , A.DISP_YN
+		     , A.REQ_YN
+		FROM TB_GOODS_NOTI_INFO C
+		INNER JOIN TB_NOTI_INFO A ON C.NI_CLSF_CD = A.NI_CLSF_CD
+		                          AND C.NI_ITEM_CD = A.NI_ITEM_CD
+		                          AND A.SUPPLY_COMP_CD = CASE #{supplyCompCd} 
+		                                                 WHEN 'S0001' THEN 'S0001'
+		                                                 WHEN 'S0002' THEN 'S0002'
+		                                                 ELSE 'E' END
+		WHERE C.GOODS_CD = #{goodsCd}
+		AND C.NI_CLSF_CD = #{niClsfCd}
+		ORDER BY C.DISP_ORD
+	</select>
+	
+	<!-- 상품 기본정보 이력 생성 -->
+	<insert id="createGoodsHst" parameterType="Goods">
+		/* TsaGoods.createGoodsHst */
+		INSERT INTO TB_GOODS_HST 
+		(       GOODS_CD
+		      , BRAND_CD
+		      , ITEMKIND_CD
+		      , GOODS_NM
+		      , GOODS_TNM
+		      , GOODS_SNM
+		      , GOODS_SNM1
+		      , COLOR_CD
+		      , MAIN_COLOR_YN
+		      , STYLE_YEAR
+		      , SEASON_CD
+		      , SEX_GB
+		      , GOODS_NUM
+		      , GOODS_TYPE
+		      , LIST_PRICE
+		      , CURR_PRICE
+		      , CURR_BPRICE
+		      , PRICE_UPD_DT
+		      , DC_RATE
+		      , GOODS_STAT
+		      , SELF_MALL_YN
+		      , GOODS_GB
+		      , DISTRIBUTION_GB
+		      , SELF_GOODS_YN
+		      , SUPPLY_COMP_CD
+		      , SUPPLY_GOODS_CD
+		      , AGE_GRP_CD
+		      , DELV_FEE
+		      , MIN_ORD_AMT
+		      , PNT_PRATE
+		      , PNT_MRATE
+		      , SELL_FEE_RATE
+		      , FORMAL_GB
+		      , CHANGEABLE_YN
+		      , RETURNABLE_YN
+		      , CHANGE_FEE_FREE_YN
+		      , RETURN_FEE_FREE_YN
+		      , PRE_PPNT_USABLE_YN
+		      , PRE_MPNT_USABLE_YN
+		      , MIN_ORD_QTY
+		      , MAX_ORD_QTY
+		      , DAY_MAX_ORD_QTY
+		      , FRST_CFRM_DT
+		      , MAKE_NM
+		      , MAKE_YMD
+		      , TAX_GB
+		      , ERP_PRICE_LINK_YN
+		      , ERP_STOCK_LINK_YN
+		      , REG_NO
+		      , REG_DT
+		      , UPD_NO
+		      , UPD_DT
+		)
+		SELECT GOODS_CD            
+		     , BRAND_CD            
+		     , ITEMKIND_CD         
+		     , GOODS_NM            
+		     , GOODS_TNM           
+		     , GOODS_SNM           
+		     , GOODS_SNM1          
+		     , COLOR_CD            
+		     , MAIN_COLOR_YN
+		     , STYLE_YEAR          
+		     , SEASON_CD           
+		     , SEX_GB              
+		     , GOODS_NUM           
+		     , GOODS_TYPE          
+		     , LIST_PRICE          
+		     , CURR_PRICE          
+		     , CURR_BPRICE         
+		     , PRICE_UPD_DT        
+		     , DC_RATE             
+		     , GOODS_STAT          
+		     , SELF_MALL_YN             
+		     , GOODS_GB            
+		     , DISTRIBUTION_GB     
+		     , SELF_GOODS_YN       
+		     , SUPPLY_COMP_CD      
+		     , SUPPLY_GOODS_CD     
+		     , AGE_GRP_CD          
+		     , DELV_FEE            
+		     , MIN_ORD_AMT         
+		     , PNT_PRATE           
+		     , PNT_MRATE           
+		     , SELL_FEE_RATE       
+		     , FORMAL_GB           
+		     , CHANGEABLE_YN       
+		     , RETURNABLE_YN       
+		     , CHANGE_FEE_FREE_YN  
+		     , RETURN_FEE_FREE_YN  
+		     , PRE_PPNT_USABLE_YN  
+		     , PRE_MPNT_USABLE_YN  
+		     , MIN_ORD_QTY         
+		     , MAX_ORD_QTY         
+		     , DAY_MAX_ORD_QTY     
+		     , FRST_CFRM_DT        
+		     , MAKE_NM             
+		     , MAKE_YMD            
+		     , TAX_GB              
+		     , ERP_PRICE_LINK_YN   
+		     , ERP_STOCK_LINK_YN   
+		     , #{regNo}              
+		     , NOW()              
+		     , UPD_NO              
+		     , UPD_DT              
+		FROM TB_GOODS
+		WHERE GOODS_CD = #{goodsCd}
+	</insert>
+	
+	<!-- 상품  수정 항목 일괄변경 -->
+	<update id="updateGoodsState" parameterType="Goods">
+		/* TsaGoods.updateGoodsState */
+		UPDATE TB_GOODS SET
+		      UPD_NO = #{updNo}
+		    , UPD_DT = NOW()
+		<if test="goodsStat != null and goodsStat != ''" >
+		    , GOODS_STAT = #{goodsStat}
+		    , FRST_CFRM_DT = IF(#{chGoodsStatYn} = 'Y', COALESCE(FRST_CFRM_DT, NOW()) , FRST_CFRM_DT)
+		</if>
+		<if test="erpStockLinkYn != null and erpStockLinkYn != ''" >
+		    , ERP_STOCK_LINK_YN = #{erpStockLinkYn}
+		</if>
+		<if test="erpPriceLinkYn != null and erpPriceLinkYn != ''" >
+		    , ERP_PRICE_LINK_YN = #{erpPriceLinkYn}
+		</if>
+		<if test="formalGb != null and formalGb != ''" >
+		    , FORMAL_GB = #{formalGb}
+		    , PNT_PRATE = IFNULL(#{pntPrate}, PNT_PRATE)
+		    , PNT_MRATE = IFNULL(#{pntMrate}, PNT_MRATE)
+		</if>
+		<if test='procJob == "pntPrate" and pntPrate != null' >
+		    , PNT_PRATE = #{pntPrate}
+		</if>
+		<if test='procJob == "pntMrate"  and pntMrate != null' >
+		    , PNT_MRATE = #{pntMrate}
+		</if>
+		<if test="returnableYn != null and returnableYn != ''" >
+		    , RETURNABLE_YN = #{returnableYn}
+		</if>
+		<if test="changeableYn != null and changeableYn != ''" >
+		    , CHANGEABLE_YN = #{changeableYn}
+		</if>
+		<if test="prePpntUsableYn != null and prePpntUsableYn != ''" >
+		    , PRE_PPNT_USABLE_YN = #{prePpntUsableYn}
+		</if>
+		<if test="preMpntUsableYn != null and preMpntUsableYn != ''" >
+		    , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
+		</if>
+		<if test='procJob == "minOrdAmt"  and minOrdAmt != null and minOrdAmt != ""' >
+		    , MIN_ORD_AMT = #{minOrdAmt}
+		</if>
+		<if test='blankFlag != null and blankFlag == "Y"'>
+		    , GOODS_TNM = ''
+		</if>
+		<if test="goodsTnm != null and goodsTnm != ''" >
+		    , GOODS_TNM = #{goodsTnm}
+		</if>
+		<if test="minOrdQty != null and minOrdQty > 0" >
+		    , MIN_ORD_QTY = #{minOrdQty}
+		</if>
+		<if test="maxOrdQty != null and maxOrdQty > 0" >
+		    , MAX_ORD_QTY = #{maxOrdQty}
+		</if>
+		<if test="dayMaxOrdQty != null and dayMaxOrdQty > 0" >
+		    , DAY_MAX_ORD_QTY = #{dayMaxOrdQty}
+		</if>
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+	
+	<!-- 상품 이미지 필수  항목 입력 여부  조회 -->
+	<select id="getGoodsImgsYn" parameterType="Goods" resultType="Goods">
+		/* TsaGoods.getGoodsImgsYn */
+		SELECT A.GOODS_CD
+		     , A.SUPPLY_COMP_CD
+		     , (SELECT I.NI_CLSF_CD FROM TB_ITEMKIND I WHERE I.ITEMKIND_CD = A.ITEMKIND_CD) AS NI_CLSF_CD
+		     , CASE WHEN B.IMG_PATH1 IS NULL THEN
+		            'N'
+		       ELSE
+		            'Y'
+		       END AS GOODS_IMAGE_YN
+		FROM TB_GOODS A
+		LEFT OUTER JOIN TB_GOODS_IMG B ON A.GOODS_CD = B.GOODS_CD
+		WHERE 1 = 1
+		<choose>
+		<when test="goodsCd != null and goodsCd != ''">
+		AND A.GOODS_CD  = #{goodsCd}
+		</when>
+		<otherwise>
+		AND A.GOODS_CD IN
+		    <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		#{item}
+		    </foreach>
+		</otherwise>
+		</choose>
+	</select>
+	
+	<!-- 상품 정보 이력 -->
+	<select id="getGoodsHstList" parameterType="Goods" resultType="GoodsHst">
+		/*TsaGoods.getGoodsHstList*/
+		SELECT CURR_PRICE
+		     , CURR_BPRICE
+		     , GOODS_NM
+		     , GOODS_TNM
+		     , GOODS_SNM
+		     , FORMAL_GB
+		     , GOODS_STAT
+		     , SELL_FEE_RATE
+		     , ERP_STOCK_LINK_YN
+		     , CHANGEABLE_YN
+		     , PRE_PPNT_USABLE_YN
+		     , PRE_MPNT_USABLE_YN
+		     , GOODS_SNM1
+		     , ITEMKIND_CD
+		     , SELF_MALL_YN
+		     , DATE_FORMAT(FRST_CFRM_DT, '%Y%m%d%H%i%S') AS FRST_CFRM_DT
+		     , UPD_NO
+		     , FN_GET_USER_NM(UPD_NO) AS UPD_NM
+		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		     , REG_NO
+		     , FN_GET_USER_NM(REG_NO) AS REG_NM
+		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		FROM TB_GOODS_HST
+		WHERE GOODS_CD = #{goodsCd}
+		ORDER BY REG_DT DESC
+	</select>
+	
+	<!-- 상품 품목 변경 -->
+	<update id="updateGoodItemKindCd" parameterType="Goods">
+		/* TsaGoods.updateGoodItemKindCd */
+		UPDATE TB_GOODS
+		SET ITEMKIND_CD = #{itemkindCd}
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		WHERE GOODS_CD = #{goodsCd}
+	</update >
+	
+	<!-- 상품 자동 검색어 조회-->
+	<select id="getGoodsSnm" parameterType="String" resultType="String">
+		/* TsaGoods.getGoodsSnm */
+		SELECT UPPER(CONCAT(
+		       G.GOODS_CD,';',
+		       REPLACE(G.GOODS_NM,' ',''),';',
+		       B.BRAND_ENM,';',
+		       B.BRAND_KNM,';',
+		       B.BRAND_GRP_NM,';',
+		       G.STYLE_YEAR,';',
+		       FN_GET_CODE_NM('G006',G.SEASON_CD),';',
+		       FN_GET_CODE_NM('G007',G.SEX_GB),';',
+		       G.COLOR_CD,';',
+		       C.COLOR_ENM,';',
+		       C.COLOR_KNM,';',
+		       REPLACE(I.ITEMKIND_NM,'>',';')
+		       )) AS GOODS_SNM
+		FROM TB_GOODS G
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		LEFT OUTER JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD
+		LEFT OUTER JOIN TB_COLOR C ON G.COLOR_CD = C.COLOR_CD
+		WHERE G.GOODS_CD = #{goodsCd}
+	</select>
+	
+	<!-- 상품검색어 수정 -->
+	<update id="updateGoodsSnm" parameterType="Goods">
+		/* TsaGoods.updateGoodsSnm */
+		UPDATE TB_GOODS A
+		SET UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		  , GOODS_SNM = #{goodsSnm} 
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+	
+	<!-- 상품 품목변경 고시정보 조회  -->
+	<select id="getNewNotiInfo" parameterType="Goods" resultType="GoodsNotiInfo">
+		/* TsaGoods.getNewNotiInfo */
+		SELECT D.NI_CLSF_CD
+		     , NVL(C.NI_ITEM_CD, D.NI_ITEM_CD) AS NI_ITEM_CD
+		     , NVL(C.NI_CONTENT, D.NI_CONTENT) AS NI_CONTENT
+		     , D.DISP_ORD
+		FROM (
+		       SELECT A.NI_CLSF_CD
+		          , A.NI_ITEM_CD
+		          , A.NI_CONTENT
+		          , A.DISP_ORD
+		       FROM TB_NOTI_INFO A
+		          , TB_ITEMKIND B
+		       WHERE A.NI_CLSF_CD = B.NI_CLSF_CD
+		       AND A.SUPPLY_COMP_CD = #{supplyCompCd}
+		       AND B.ITEMKIND_CD = #{itemkindCd}
+		     ) D
+		    LEFT OUTER JOIN (
+		       SELECT NI_ITEM_CD
+		            , NI_CONTENT 
+		       FROM TB_GOODS_NOTI_INFO
+		       WHERE GOODS_CD = #{goodsCd}
+		     ) C
+		     ON (
+		       C.NI_ITEM_CD = D.NI_ITEM_CD
+		     )
+		ORDER BY D.DISP_ORD
+	</select>
+	
+	<!-- 상품 품목변경 고시정보 삭제  -->
+	<delete id="deleteGoodsNotiInfo" parameterType="Goods">
+		/* TsaGoods.deleteGoodsNotiInfo */
+		DELETE FROM TB_GOODS_NOTI_INFO
+		WHERE GOODS_CD = #{goodsCd}
+	</delete>
+	
+	<!-- 상품 고시 정보  저장 -->
+	<update id="saveGoodsNotiInfo" parameterType="GoodsNotiInfo">
+		/* TsaGoods.saveGoodsNotiInfo */
+		INSERT INTO TB_GOODS_NOTI_INFO(
+		       GOODS_CD
+		     , NI_CLSF_CD
+		     , NI_ITEM_CD
+		     , NI_CONTENT
+		     , DISP_ORD
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{goodsCd}
+		     , #{niClsfCd}
+		     , #{niItemCd}
+		     , #{niContent}
+		     , #{dispOrd}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       NI_CONTENT = #{niContent}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</update>
+	
+	<!-- 상품 사이즈 조회 -->
+	<select id="getGoodsSizeList" parameterType="Goods" resultType="Option">
+		/* TsaGoods.getGoodsSizeList */
+		WITH RECURSIVE TMP_GOODS AS (
+		    SELECT A.GOODS_CD 
+		         , A.GOODS_TYPE 
+		         , IFNULL(B.COMPS_GOODS_CD, A.GOODS_CD) AS COMPS_GOODS_CD
+		         , IFNULL(B.DISP_ORD,1) AS DISP_ORD
+		         , A.SELF_GOODS_YN
+		    FROM TB_GOODS A 
+		    LEFT OUTER JOIN TB_GOODS_COMPOSE B ON A.GOODS_CD = B.GOODS_CD
+		    WHERE A.GOODS_CD = #{goodsCd}
+		    )
+		SELECT #{goodsCd} AS GOODS_CD
+		     , A.GOODS_CD AS COMPS_GOODS_CD
+		     , A.OPT_CD
+		     , CONCAT(A.OPT_NM1,  NVL2(A.OPT_NM2, '', CONCAT('/', A.OPT_NM2))) AS OPT_NM 
+		     , A.OPT_NM1
+		     , A.OPT_NM2
+		     , A.BASE_STOCK_QTY
+		     , A.CURR_STOCK_QTY
+		     , IFNULL(B.STOCK_QTY,0) AS SALE_STOCK_QTY
+		     , GREATEST(GREATEST(A.CURR_STOCK_QTY - A.BASE_STOCK_QTY, 0) - IFNULL(B.STOCK_QTY, 0), 0) AS ABLE_STOCK_QTY
+		     , A.SOLDOUT_YN
+		     , A.DISP_ORD
+		     , A.DISP_YN
+		     , COUNT(*) OVER(PARTITION BY A.GOODS_CD ) AS RCOUNT
+		     , ROW_NUMBER() OVER(PARTITION BY A.GOODS_CD ORDER BY A.DISP_ORD) AS RNUM
+		FROM  TMP_GOODS C 
+		INNER JOIN TB_OPTION A ON C.COMPS_GOODS_CD = A.GOODS_CD 
+		LEFT OUTER JOIN (
+		                 SELECT Z.GOODS_CD
+		                      , Z.OPT_CD
+		                      , SUM((CASE Z.SELL_GB WHEN '10' THEN 1
+		                                            WHEN '20' THEN 1
+		                                            ELSE -1 END) * Z.SELL_QTY) AS STOCK_QTY
+		                 FROM TB_SELL_QTY Z
+		                 INNER JOIN TMP_GOODS Y ON Z.GOODS_CD = Y.COMPS_GOODS_CD
+		                 GROUP BY Z.GOODS_CD, Z.OPT_CD
+		                ) B
+		           ON (  A.GOODS_CD = B.GOODS_CD
+		             AND A.OPT_CD = B.OPT_CD)
+		WHERE 1 = 1
+		AND C.GOODS_CD = #{goodsCd}
+		ORDER BY C.DISP_ORD, A.DISP_ORD
+	</select>
+	
+	<!-- 구성상품 목록 -->
+	<select id="getGoodsDetailComposeList" parameterType="Goods" resultType="GoodsCompose">
+		/* TsaGoods.getGoodsDetailComposeList */
+		SELECT A.GOODS_CD
+		     , A.GOODS_TYPE
+		     , FN_GET_CODE_NM('G056', A.GOODS_TYPE) AS GOODS_TYPE_NM
+		     , A.COMPS_GOODS_CD
+		     , B.GOODS_NM AS COMPS_GOODS_NM
+		     , A.DISP_ORD
+		     , A.QTY
+		     , A.COMPS_CURR_PRICE
+		     , A.COMPS_CURR_PRICE AS COMPS_CURR_PRICE_ORG
+		     , A.COMPS_GOODS_OPT_NM
+		     , A.BASE_YN
+		     , A.USE_YN
+		     , B.CURR_PRICE
+		     , B.GOODS_STAT
+		     , B.SELF_GOODS_YN
+		     , B.SUPPLY_COMP_CD
+		     , I.IMG_PATH1
+		     , I.IMG_PATH6
+		     , I.IMG_TYPE
+		     , A.REG_NO
+		     , FN_GET_USER_NM(A.REG_NO) AS REG_NM
+		     , DATE_FORMAT(A.REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , A.UPD_NO
+		     , FN_GET_USER_NM(A.UPD_NO) AS UPD_NM
+		     , DATE_FORMAT(A.UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		FROM TB_GOODS_COMPOSE A
+		INNER JOIN  TB_GOODS B ON A.COMPS_GOODS_CD = B.GOODS_CD
+		LEFT OUTER JOIN TB_GOODS_IMG I ON A.COMPS_GOODS_CD = I.GOODS_CD
+		WHERE A.GOODS_CD = #{goodsCd}
+		ORDER BY A.DISP_ORD 
+	</select>
+	
+	<!-- 상품 기본 정보 등록 -->
+	<insert id="createGoods" parameterType="Goods">
+		/* TsaGoods.createGoods */
+		INSERT INTO TB_GOODS (
+		    GOODS_CD
+		  , BRAND_CD
+		  , ITEMKIND_CD
+		  , GOODS_NM
+		  , GOODS_TNM
+		  , GOODS_SNM
+		  , GOODS_SNM1
+		  , COLOR_CD
+		  , MAIN_COLOR_YN
+		  , STYLE_YEAR
+		  , SEASON_CD
+		  , SEX_GB
+		  , GOODS_NUM
+		  , GOODS_TYPE
+		  , LIST_PRICE
+		  , CURR_PRICE
+		  , DC_RATE
+		  , GOODS_STAT
+		  , SELF_MALL_YN
+		  , GOODS_GB
+		  , DISTRIBUTION_GB
+		  , SELF_GOODS_YN
+		  , SUPPLY_COMP_CD
+		  , SUPPLY_GOODS_CD
+		  , AGE_GRP_CD
+		  , DELV_FEE
+		  , MIN_ORD_AMT
+		  , PNT_PRATE
+		  , PNT_MRATE
+		  , SELL_FEE_RATE
+		  , FORMAL_GB
+		  , MAKE_NM
+		  , MAKE_YMD
+		  , TAX_GB
+		  , ERP_STOCK_LINK_YN
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES(
+		    #{goodsCd}
+		  , #{brandCd}
+		  , #{itemkindCd}
+		  , NVL(#{goodsNm},'상품명없음')
+		  , #{goodsTnm}
+		  , #{goodsSnm}
+		  , #{goodsSnm1}
+		  , #{colorCd}
+		  , #{mainColorYn}
+		  , #{styleYear}
+		  , #{seasonCd}
+		  , #{sexGb}
+		  , #{goodsNum}
+		  , NVL(#{goodsType},'N')
+		  , #{listPrice}
+		  , #{currPrice}
+		  , #{dcRate}
+		  , #{goodsStat}
+		  , NVL(#{selfMallYn},'Y') 
+		  , #{goodsGb}
+		  , #{distributionGb}
+		  , #{selfGoodsYn}
+		  , #{supplyCompCd}
+		  , #{supplyGoodsCd}
+		  , #{ageGrpCd}
+		  , #{delvFee}
+		  , #{minOrdAmt}
+		  , #{pntPrate}
+		  , #{pntMrate}
+		  , #{sellFeeRate}
+		  , #{formalGb}
+		  , #{makeNm}
+		  , #{makeYmd}
+		  , #{taxGb}
+		  , NVL(#{erpStockLinkYn},'N')
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+	</insert>
+	
+	<!-- 상품 기본 정보 등록 -->
+	<insert id="createGoodsSmmary" parameterType="Goods">
+		/* TsaGoods.createGoodsSmmary */
+		INSERT INTO TB_GOODS_SUMMARY (
+		    GOODS_CD
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES(
+		    #{goodsCd}
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+	</insert>
+	
+	<!-- 상품 기본 정보 수정 -->
+	<update id="updateGoods" parameterType="Goods">
+		/* TsaGoods.updateGoods */
+		UPDATE TB_GOODS
+		SET GOODS_TNM = #{goodsTnm}
+		  , GOODS_NM = #{goodsNm}
+		  , SEASON_CD = #{seasonCd}
+		  , SEX_GB = #{sexGb}
+		  , CURR_PRICE = #{currPrice}
+		  <if test="currBprice != null and currBprice != ''">
+		  , CURR_BPRICE = #{currBprice}
+		  , PRICE_UPD_DT = NOW()
+		  </if>
+		  , DC_RATE = #{dcRate}
+		  , GOODS_STAT = #{goodsStat}
+		  , GOODS_GB = #{goodsGb}
+		  , MIN_ORD_AMT = #{minOrdAmt}
+		  , PNT_PRATE = #{pntPrate}
+		  , PNT_MRATE = #{pntMrate}
+		  , FORMAL_GB = #{formalGb}
+		  , MIN_ORD_QTY = #{minOrdQty}
+		  , MAX_ORD_QTY = #{maxOrdQty}
+		  , DAY_MAX_ORD_QTY = #{dayMaxOrdQty}
+		  , ERP_STOCK_LINK_YN = #{erpStockLinkYn}
+		  , GOODS_SNM1 = #{goodsSnm1}
+		  , SELF_MALL_YN = #{selfMallYn}
+		  , GOODS_SNM = #{goodsSnm}
+		  , FRST_CFRM_DT = (CASE #{chGoodsStatYn} WHEN 'Y' THEN NVL2(FRST_CFRM_DT, NOW(), FRST_CFRM_DT)
+		                                          ELSE FRST_CFRM_DT END)
+		  , PRE_PPNT_USABLE_YN = #{prePpntUsableYn}
+		  , PRE_MPNT_USABLE_YN = #{preMpntUsableYn}
+		  , DISTRIBUTION_GB = #{distributionGb}
+		  , AGE_GRP_CD = #{ageGrpCd}
+		  , SELL_FEE_RATE = #{sellFeeRate}
+		  , UPD_NO = #{updNo}
+		  , UPD_DT = NOW()
+		WHERE GOODS_CD = #{goodsCd}
+	</update>
+	
+	<!-- 상품 상세정보 삭제 -->
+	<delete id="deleteGoodsDesc" parameterType="GoodsDesc">
+		/* TsaGoods.deleteGoodsDesc */
+		DELETE FROM TB_GOODS_DESC
+		WHERE GOODS_CD = #{goodsCd}
+		AND DESC_GB = #{descGb}
+	</delete>
+	
+	<!-- 상품 상세정보 등록 -->
+	<insert id="createGoodsDesc" parameterType="GoodsDesc">
+		/* TsaGoods.createGoodsDesc */
+		INSERT INTO TB_GOODS_DESC (
+		    GOODS_CD
+		  , DESC_GB
+		  , SEQ
+		  , GOODS_DESC
+		  , REG_NO
+		  , REG_DT
+		)
+		VALUES(
+		    #{goodsCd}
+		  , #{descGb}
+		  , #{seq}
+		  , REPLACE(#{goodsDesc},char(13), CONCAT(char(13),char(10)))
+		  , #{regNo}
+		  , NOW()
+		)
+	</insert>
+	
+	<!-- 구상 상품등록/저장 -->
+	<insert id="saveGoodsCompose" parameterType="GoodsCompose">
+		/* TsaGoods.saveGoodsCompose */
+		INSERT INTO TB_GOODS_COMPOSE (
+		           GOODS_CD
+		         , COMPS_GOODS_CD
+		         , GOODS_TYPE
+		         , DISP_ORD
+		         , QTY
+		         , COMPS_CURR_PRICE
+		         , COMPS_GOODS_OPT_NM
+		         , BASE_YN
+		         , USE_YN
+		         , REG_NO
+		         , REG_DT
+		         , UPD_NO
+		         , UPD_DT
+		    )
+		    VALUES (
+		           #{goodsCd}
+		         , #{compsGoodsCd}
+		         , #{goodsType}
+		         , #{dispOrd}
+		         , #{qty}
+		         , (CASE WHEN #{goodsType} = 'G056_S' THEN #{compsCurrPrice}
+		                ELSE 0 END)
+		         , #{compsGoodsOptNm}
+		         , #{baseYn}
+		         , #{useYn}
+		         , #{regNo}
+		         , NOW()
+		         , #{updNo}
+		         , NOW()
+		    )
+		ON DUPLICATE KEY UPDATE 
+		           DISP_ORD = #{dispOrd}
+		         , COMPS_GOODS_OPT_NM = #{compsGoodsOptNm}
+		         , COMPS_CURR_PRICE = (CASE WHEN #{goodsType} = 'G056_S' THEN #{compsCurrPrice}
+		                                    ELSE 0 END)
+		         , USE_YN = #{useYn}
+		         , UPD_NO = #{updNo}
+		         , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 상품 옵션/재고 정보 이력생성 -->
+	<insert id="createStockHst" parameterType="Option">
+	/* TsaGoods.createStockHst */
+		INSERT INTO TB_OPTION_HST 
+		(     OPTION_HST_SQ
+		    , GOODS_CD
+		    , OPT_CD
+		    , OPT_NM1
+		    , OPT_NM2
+		    , BASE_STOCK_QTY
+		    , CURR_STOCK_QTY
+		    , ADD_PRICE
+		    , SOLDOUT_YN
+		    , DISP_ORD
+		    , DISP_YN
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT NULL
+		     , GOODS_CD
+		     , OPT_CD
+		     , OPT_NM1
+		     , OPT_NM2
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , #{regNo}
+		     , NOW()
+		     , UPD_NO
+		     , UPD_DT
+		FROM TB_OPTION
+		WHERE GOODS_CD = #{goodsCd}
+		<if test='optCd != null and optCd != ""'>
+		AND OPT_CD = #{optCd}
+		</if>
+	</insert>
+	
+	<!-- 상품 옵션/재고 정보 저장 -->
+	<update id="saveStock" parameterType="Option">
+		/* TsaGoods.saveStock */
+		INSERT INTO TB_OPTION(
+		       GOODS_CD
+		     , OPT_CD
+		     , OPT_NM1
+		     , OPT_NM2
+		     , BASE_STOCK_QTY
+		     , CURR_STOCK_QTY
+		     , ADD_PRICE
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		     , DISP_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{goodsCd}
+		     , #{optCd}
+		     , #{optNm1}
+		     , #{optNm2}
+		     , #{baseStockQty}
+		     , #{currStockQty}
+		     , #{addPrice}
+		     , #{soldoutYn}
+		     , #{dispOrd}
+		     , #{dispYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE 
+		        BASE_STOCK_QTY = #{baseStockQty}
+		      , OPT_NM1 = #{optNm1}
+		      , OPT_NM2 = #{optNm2}
+		      , ADD_PRICE = #{addPrice}
+		      , SOLDOUT_YN = #{soldoutYn}
+		      , DISP_ORD = #{dispOrd}
+		      , DISP_YN = #{dispYn}
+		      , UPD_NO = #{updNo}
+		      , UPD_DT = NOW()
+		      <if test='selfGoodsYn != null and selfGoodsYn == "N"'>
+		      , CURR_ON_STOCK_QTY = #{currOnStockQty}
+		      </if>
+	</update>
+	
+	<!-- 같은 품번 상품목록  -->
+	<select id="getGoodsNumGoodsList" parameterType="Goods" resultType="Goods">
+		/* TsaGoods.getGoodsNumGoodsList */
+		SELECT G.GOODS_CD
+		     , G.GOODS_NM
+		     , G.COLOR_CD
+		     , G.MAIN_COLOR_YN
+		     , G.GOODS_NUM
+		     , G.GOODS_STAT
+		     , GI.IMG_PATH1
+		     , GI.IMG_PATH6
+		     , GI.IMG_TYPE
+		FROM TB_GOODS G
+		LEFT OUTER JOIN TB_GOODS_IMG GI ON G.GOODS_CD = GI.GOODS_CD
+		WHERE GOODS_NUM = (SELECT GOODS_NUM FROM TB_GOODS TG WHERE GOODS_CD = #{goodsCd})
+	</select>
+	
+	<!-- 상품코드 생성 -->
+	<insert id="createGoodsSequence" parameterType="Goods">
+		/* TsaGoods.createGoodsSequence */
+		<selectKey keyProperty="goodsSq" resultType="int" order="AFTER">
+		SELECT MAX(GOODS_SQ) FROM TB_GOODS_SEQUENCE
+		</selectKey>
+		INSERT INTO TB_GOODS_SEQUENCE (GOODS_SQ) VALUES (NULL)
+	</insert>
+
+	<!-- 상품 타이틀 예약관리 목록 건수 -->
+	<select id="getGoodsTitleReserveCount" parameterType="GoodsSearch" resultType="int">
+		/* TsaGoods.getGoodsTitleReserveCount */
+		SELECT COUNT(*) AS TOTCNT
+		FROM TB_GOODS G
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		INNER JOIN TB_GOODS_TNM_RES GR ON G.GOODS_CD = GR.GOODS_CD
+		<if test="searchGb == null or searchGb =='BASIC'" >
+		    <if test="applyStdt != null and applyStdt != ''">
+		                               AND GR.APPLY_EDDT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
+		    </if>
+		    <if test="applyEddt != null and applyEddt != ''">
+		    <![CDATA[
+		                               AND GR.APPLY_STDT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		    ]]>
+		    </if>
+		    <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		                               AND GR.APPLY_EDDT >= NOW() 
+		    </if>
+		</if>
+		<if test="searchGb != null and searchGb =='EXCEL'">
+		INNER JOIN (
+		            SELECT SEARCH_CD
+		                 , TMP_DISP_ORD
+		            FROM (
+		                  SELECT SEARCH_CD
+		                       , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                  FROM TB_SEARCH_DATA
+		                  WHERE REG_NO = #{regNo}
+		                  GROUP BY SEARCH_CD) T
+		          ) SD
+		          ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		               OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		               <if test="mdNo != null and mdNo > 0">
+		               AND G.BRAND_CD IN (
+		                                  SELECT DISTINCT BRAND_CD
+		                                  FROM TB_BRAND_MD
+		                                  WHERE MD_NO = #{mdNo}
+		                                  )
+		              </if>
+		           )
+		</if>
+		WHERE 1=1
+		<if test="searchGb == null or searchGb =='BASIC'" >
+		<include refid="getGoodsListCondition_sql"/>
+		</if>
+	</select>
+
+	<!-- 상품 타이틀 예약관리 목록 -->
+	<select id="getGoodsTitleReserveList" parameterType="GoodsSearch" resultType="GoodsTnmRes">
+		/* TsaGoods.getGoodsTitleReserveList */
+		SELECT Z.*
+		FROM (
+		    SELECT A.*, @rownum := @rownum + 1 AS RNUM FROM (
+		        SELECT
+		                G.GOODS_CD
+		              , B.BRAND_ENM
+		              , B.BRAND_GRP_NM
+		              , G.BRAND_CD
+		              , G.SUPPLY_COMP_CD
+		              , G.SUPPLY_GOODS_CD
+		              , G.GOODS_NM
+		              , G.GOODS_TNM
+		              , G.SELF_GOODS_YN
+		              , G.GOODS_STAT
+		              , GR.GOODS_TNM_RES_SQ
+		              , GR.GOODS_TNM AS REG_GOODS_TNM
+		              , DATE_FORMAT(GR.APPLY_STDT,'%Y%m%d%H%i%S') AS APPLY_STDT
+		              , DATE_FORMAT(GR.APPLY_EDDT,'%Y%m%d%H%i%S') AS APPLY_EDDT
+		              , GR.REG_NO
+		              , FN_GET_USER_NM(GR.REG_NO) AS REG_NM
+		              , DATE_FORMAT(GR.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		        FROM TB_GOODS G
+		        JOIN ( SELECT @rownum := 0) R
+		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		        INNER JOIN TB_GOODS_TNM_RES GR ON G.GOODS_CD = GR.GOODS_CD
+		        <if test="searchGb == null or searchGb =='BASIC'" >
+		            <if test="applyStdt != null and applyStdt != ''">
+		                                       AND GR.APPLY_EDDT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
+		            </if>
+		            <if test="applyEddt != null and applyEddt != ''">
+		            <![CDATA[
+		                                       AND GR.APPLY_STDT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		            ]]>
+		            </if>
+		            <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		                                       AND GR.APPLY_EDDT >= NOW() 
+		            </if>
+		        </if>
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        INNER JOIN (
+		                    SELECT SEARCH_CD
+		                         , TMP_DISP_ORD
+		                    FROM (
+		                          SELECT SEARCH_CD
+		                               , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                          FROM TB_SEARCH_DATA
+		                          WHERE REG_NO = #{regNo}
+		                          GROUP BY SEARCH_CD) T
+		                  ) SD
+		                  ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		                       OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		                       <if test="mdNo != null and mdNo > 0">
+		                      AND G.BRAND_CD IN (
+		                                          SELECT DISTINCT BRAND_CD
+		                                          FROM TB_BRAND_MD
+		                                          WHERE MD_NO = #{mdNo}
+		                                          )
+		                      </if>
+		                   )
+		        </if>
+		        WHERE 1=1
+		        <if test="searchGb == null or searchGb =='BASIC'" >
+		        <include refid="getGoodsListCondition_sql"/>
+		        ORDER BY  GR.APPLY_STDT DESC, GR.APPLY_EDDT DESC, G.GOODS_CD, GR.GOODS_TNM_RES_SQ
+		        </if>
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        ORDER BY SD.TMP_DISP_ORD
+		        </if>
+		<include refid="getListPagingCondition_sql"/>
+	</select>
+
+	<!-- 상품 타이틀 예약조회(기간 체크용) -->
+	<select id="getGoodsTnmDupChkCount" parameterType="GoodsTnmRes" resultType="int">
+		/* TsaGoods.getGoodsTnmDupChkCount */
+		SELECT COUNTS(GOODS_CD)
+		FROM TB_GOODS_TNM_RES
+		WHERE 1=1
+		<![CDATA[
+		AND APPLY_STDT <= DATE_FORMAT(#{applyStdt}, '%Y%m%d%H%i%S')
+		]]>
+		AND APPLY_EDDT >= DATE_FORMAT(#{applyEddt},'%Y%m%d%H%i%S')
+		AND GOODS_CD = #{goodsCd}
+	</select>
+	
+	<!-- 상품 타이틀 예약 등록 -->
+	<insert id="createGoodTnmRes" parameterType="GoodsTnmRes">
+		/* TsaGoods.createGoodTnmRes */
+		INSERT INTO TB_GOODS_TNM_RES (
+		    GOODS_TNM_RES_SQ
+		  , GOODS_CD
+		  , GOODS_TNM
+		  , APPLY_STDT
+		  , APPLY_EDDT
+		  , REG_NO
+		  , REG_DT
+		  , UPD_NO
+		  , UPD_DT
+		)
+		VALUES(
+		    NULL
+		  , #{goodsCd}
+		  , #{goodsTnm}
+		  , STR_TO_DATE(#{applyStdt},'%Y%m%d%H%i%S')
+		  , STR_TO_DATE(#{applyEddt},'%Y%m%d%H%i%S')
+		  , #{regNo}
+		  , NOW()
+		  , #{updNo}
+		  , NOW()
+		)
+	</insert>
+	
+	<!-- 상품 타이틀 수정 -->
+	<update id="updateGoodTnm" parameterType="Goods">
+		/* TsaGoods.updateGoodTnm */
+		UPDATE TB_GOODS
+		SET GOODS_TNM = #{goodsTnm}
+		  , UPD_NO = #{updNo} 
+		  , UPD_DT = NOW()
+		WHERE GOODS_CD = #{goodsCd}
+	</update >
+	
+	<!-- 상품 타이틀 예약 삭제 -->
+	<delete id="deleteGoodTnmRes" parameterType="GoodsTnmRes">
+		/* TsaGoods.deleteGoodTnmRes */
+		DELETE FROM TB_GOODS_TNM_RES 
+		WHERE GOODS_TNM_RES_SQ = #{goodsTnmResSq}
+	</delete>
+	
+	<!-- 상품 타이틀 예약건 초기화 -->
+	<update id="updateGoodTnmInit" parameterType="Goods">
+		/* TsaGoods.updateGoodTnmInit */
+		UPDATE TB_GOODS
+		SET UPD_NO = #{updNo} 
+		  , UPD_DT = NOW()
+		  , GOODS_TNM = (SELECT S.GOODS_TNM
+		                 FROM (
+		                       SELECT GT.GOODS_CD
+		                            , GT.GOODS_TNM
+		                            , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_TNM_RES_SQ DESC) RANK 
+		                       FROM TB_GOODS_TNM_RES GT
+		                       WHERE GT.APPLYC_YN = 'N'
+		                       AND NOW() BETWEEN GT.APPLY_STDT AND GT.APPLY_EDDT
+		                       AND GT.GOODS_CD  = #{goodsCd}
+		                      ) S
+		                 WHERE S.RANK = 1
+		                 )
+		WHERE GOODS_CD = #{goodsCd}
+	</update >
+	
+	<!-- 상품 타이틀 예약건 초기화 조회 -->
+	<select id="getGoodTnmInit" parameterType="Goods"  resultType="Goods">
+		/* TsaGoods.getGoodTnmInit */
+		SELECT GOODS_CD
+		     , GOODS_TNM
+		     , (SELECT S.GOODS_TNM
+		        FROM (
+		              SELECT GT.GOODS_CD
+		                   , GT.GOODS_TNM
+		                   , RANK() OVER(PARTITION BY GT.GOODS_CD ORDER BY GT.GOODS_TNM_RES_SQ DESC) RANK 
+		              FROM TB_GOODS_TNM_RES GT
+		              WHERE GT.APPLYC_YN = 'N'
+		              AND NOW() BETWEEN GT.APPLY_STDT AND GT.APPLY_EDDT
+		              AND GT.GOODS_CD  = #{goodsCd}
+		             ) S
+		        WHERE S.RANK = 1
+		        ) AS GOOD_TNM_INIT
+		FROM TB_GOODS
+		WHERE GOODS_CD = #{goodsCd}
+	</select>
+	
+	<!-- 네이버 EP 제외 상품 목록 건수 -->
+	<select id="getGoodsEpSkipCount" parameterType="GoodsSearch" resultType="int">
+		/* TsaGoods.getGoodsEpSkipCount */
+		SELECT COUNT(*) AS TOTCNT
+		FROM TB_GOODS G
+		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		INNER JOIN TB_GOODS_EP_SKIP GE ON G.GOODS_CD = GE.GOODS_CD
+		<if test="searchGb == null or searchGb =='BASIC'" >
+		<if test="applyStdt != null and applyStdt != ''">
+		                               AND GE.APPLY_EDDT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="applyEddt != null and applyEddt != ''">
+		<![CDATA[
+		                               AND GE.APPLY_STDT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		]]>
+		</if>
+		<if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		                               AND GE.APPLY_EDDT >= NOW() 
+		</if>
+		</if>
+		<if test="searchGb != null and searchGb =='EXCEL'">
+		INNER JOIN (
+		    SELECT SEARCH_CD
+		         , TMP_DISP_ORD
+		    FROM (
+		          SELECT SEARCH_CD
+		               , MIN(DISP_ORD) AS TMP_DISP_ORD
+		          FROM TB_SEARCH_DATA
+		          WHERE REG_NO = #{regNo}
+		          GROUP BY SEARCH_CD) T
+		  ) SD
+		  ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		       OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		       <if test="mdNo != null and mdNo > 0">
+		       AND G.BRAND_CD IN (
+		                          SELECT DISTINCT BRAND_CD
+		                          FROM TB_BRAND_MD
+		                          WHERE MD_NO = #{mdNo}
+		                          )
+		      </if>
+		   )
+		</if>
+		WHERE 1=1
+		<if test="searchGb == null or searchGb =='BASIC'" >
+		<include refid="getGoodsListCondition_sql"/>
+		</if>
+	</select>
+
+	<!-- 네이버 EP 제외 상품 목록 -->
+	<select id="getGoodsEpSkipList" parameterType="GoodsSearch" resultType="GoodsEpSkip">
+		/* TsaGoods.getGoodsEpSkipList */
+		SELECT Z.*
+		FROM (
+		    SELECT A.*, @rownum := @rownum + 1 AS RNUM FROM (
+		        SELECT
+		                G.GOODS_CD
+		              , B.BRAND_ENM
+		              , G.BRAND_CD
+		              , G.SUPPLY_COMP_CD
+		              , G.SUPPLY_GOODS_CD
+		              , G.GOODS_NM
+		              , G.GOODS_STAT
+		              , GE.GOODS_EP_SKIP_SQ
+		              , DATE_FORMAT(GE.APPLY_STDT,'%Y%m%d%H%i%S') AS APPLY_STDT
+		              , DATE_FORMAT(GE.APPLY_EDDT,'%Y%m%d%H%i%S') AS APPLY_EDDT
+		              , GE.REG_NO
+		              , FN_GET_USER_NM(GE.REG_NO) AS REG_NM
+		              , DATE_FORMAT(GE.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+		              , GE.UPD_NO
+		              , FN_GET_USER_NM(GE.UPD_NO) AS UPD_NM
+		              , DATE_FORMAT(GE.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		        FROM TB_GOODS G
+		        JOIN ( SELECT @rownum := 0) R
+		        INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		        INNER JOIN TB_SUPPLY_COMPANY S ON G.SUPPLY_COMP_CD = S.SUPPLY_COMP_CD
+		        INNER JOIN TB_GOODS_EP_SKIP GE ON G.GOODS_CD = GE.GOODS_CD
+		        <if test="searchGb == null or searchGb =='BASIC'" >
+		            <if test="applyStdt != null and applyStdt != ''">
+		                                       AND GE.APPLY_EDDT >= DATE_FORMAT(#{applyStdt}, '%Y-%m-%d %H:%i:%S')
+		            </if>
+		            <if test="applyEddt != null and applyEddt != ''">
+		            <![CDATA[
+		                                       AND GE.APPLY_STDT < DATE_FORMAT(DATE_ADD(#{applyEddt}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		            ]]>
+		            </if>
+		            <if test='beforSkipFlag != null and beforSkipFlag == "Y"'>
+		                                       AND GE.APPLY_EDDT >= NOW() 
+		            </if>
+		        </if>
+		        <if test="searchGb != null and searchGb =='EXCEL'">
+		        INNER JOIN (
+		                    SELECT SEARCH_CD
+		                         , TMP_DISP_ORD
+		                    FROM (
+		                          SELECT SEARCH_CD
+		                               , MIN(DISP_ORD) AS TMP_DISP_ORD
+		                          FROM TB_SEARCH_DATA
+		                          WHERE REG_NO = #{regNo}
+		                          GROUP BY SEARCH_CD) T
+		                  ) SD
+		                  ON ( (G.GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')
+		                       OR G.SUPPLY_GOODS_CD LIKE CONCAT(SD.SEARCH_CD,'%')) 
+		                       <if test="mdNo != null and mdNo > 0">
+		                      AND G.BRAND_CD IN (
+		                                          SELECT DISTINCT BRAND_CD
+		                                          FROM TB_BRAND_MD
+		                                          WHERE MD_NO = #{mdNo}
+		                                          )
+		                      </if>
+		                   )
+		        </if>
+		        WHERE 1=1
+		        <if test="searchGb == null or searchGb =='BASIC'">
+		        <include refid="getGoodsListCondition_sql"/>
+		        ORDER BY GE.APPLY_STDT DESC, GE.APPLY_EDDT DESC, G.GOODS_CD, GE.GOODS_EP_SKIP_SQ
+		        </if>
+		         <if test="searchGb != null and searchGb =='EXCEL'">
+		        ORDER BY SD.TMP_DISP_ORD
+		        </if>
+		<include refid="getListPagingCondition_sql"/>
+	</select>
+
+	<!-- 네이버 EP 제외 상품 조회(기간 체크용) -->
+	<select id="getGoodsEpSkipDupChkCount" parameterType="GoodsEpSkip" resultType="int">
+		/* TsaGoods.getGoodsEpSkipDupChkCount */
+		SELECT COUNT(GOODS_CD)
+		FROM TB_GOODS_EP_SKIP
+		WHERE 1=1
+		<![CDATA[
+		AND APPLY_STDT <= DATE_FORMAT(#{applyStdt}, '%Y%m%d')
+		]]>
+		AND APPLY_EDDT >= DATE_FORMAT(#{applyEddt},'%Y%m%d%')
+		AND GOODS_CD = #{goodsCd}
+	</select>
+
+	<!-- 네이버 EP 제외 상품 예약 등록 -->
+	<insert id="createGoodEpSkip" parameterType="GoodsEpSkip">
+		/* TsaGoods.createGoodEpSkip */
+		INSERT INTO TB_GOODS_EP_SKIP (
+		GOODS_EP_SKIP_SQ
+		, GOODS_CD
+		, APPLY_STDT
+		, APPLY_EDDT
+		, REG_NO
+		, REG_DT
+		, UPD_NO
+		, UPD_DT
+		)
+		VALUES(
+		  NULL
+		, #{goodsCd}
+		, STR_TO_DATE(#{applyStdt},'%Y%m%d%H%i%S')
+		, STR_TO_DATE(#{applyEddt},'%Y%m%d%H%i%S')
+		, #{regNo}
+		, NOW()
+		, #{updNo}
+		, NOW()
+		)
+	</insert>
+
+	<!-- 네이버 EP 제외 상품 예약 삭제 -->
+	<delete id="deleteGoodEpSkip" parameterType="GoodsEpSkip">
+		/* TsaGoods.deleteGoodEpSkip */
+		DELETE FROM TB_GOODS_EP_SKIP
+		WHERE GOODS_EP_SKIP_SQ = #{goodsEpSkipSq}
+	</delete>
+	
+	<!-- 상품상세 공지사항 목록 -->
+	<select id="getNoticeList" parameterType="GoodsSearch" resultType="Notice">
+		/* TsaGoods.getNoticeList */
+		SELECT A.NOTICE_SQ                                  
+		     , A.NOTICE_TYPE                                
+		     , A.NOTICE_TITLE                               
+		     , A.NOTICE_CONTENT                             
+		     , DATE_FORMAT(A.NOTICE_STDT,'%Y-%m-%d')  AS NOTICE_STDT 
+		     , DATE_FORMAT(A.NOTICE_EDDT,'%Y-%m-%d')  AS NOTICE_EDDT 
+		     , A.USE_YN                                          
+		     , FN_GET_USER_NM(A.REG_NO)             AS REG_NM    
+		     , DATE_FORMAT(A.REG_DT,'%Y-%m-%d %H:%i:%S') AS REG_DT
+		     , FN_GET_USER_NM(A.UPD_NO)             AS UPD_NM    
+		     , DATE_FORMAT(A.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT    
+		FROM   TB_NOTICE A
+		WHERE  A.NOTICE_TYPE = 'G047_30'
+		<if test="stDate != null and stDate !=''">
+		AND A.NOTICE_EDDT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="edDate != null and edDate !=''">
+		<![CDATA[
+		AND A.NOTICE_STDT < DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		]]>
+		</if>
+		<if test='useYn != null and useYn !=""'>
+		AND A.USE_YN = #{useYn}
+		</if>
+		<if test="noticeTitle != null and noticeTitle !=''">
+		AND LOWER(A.NOTICE_TITLE) LIKE CONCAT('%',LOWER(#{noticeTitle}),'%')
+		</if>
+		<if test='conditionList != null and conditionList.length>0'>
+		AND A.NOTICE_SQ IN (
+		                    SELECT NOTICE_SQ
+		                    FROM TB_NOTICE_GOODS
+		                    WHERE GOODS_CD IN (
+		                                       SELECT GOODS_CD 
+		                                       FROM TB_GOODS G
+		                                       WHERE 1 = 1
+		                                       AND (
+		    <choose>
+		      <when test='search != null and search == "searchGoodsCd"'>
+		          <foreach collection="conditionList" item="item" index="index" separator="or">
+		       UPPER(G.GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%') 
+		          </foreach>
+		      </when>
+		      <when test='search != null and search == "searchGoodsNm"'>
+		          <foreach collection="conditionList" item="item" index="index" separator="or">
+		       UPPER(G.GOODS_NM) LIKE CONCAT('%',UPPER(#{item}),'%')
+		          </foreach>
+		      </when>
+		      <when test='search != null and search == "searchGoodsNum"'>
+		          <foreach collection="conditionList" item="item" index="index" separator="or">
+		       UPPER(G.GOODS_NUM) LIKE CONCAT('%',UPPER(#{item}),'%')
+		          </foreach>
+		      </when>
+		      <when test='search != null and search == "searchSupplyGoodsCd"'>
+		          <foreach collection="conditionList" item="item" index="index" separator="or">
+		       UPPER(G.SUPPLY_GOODS_CD) LIKE CONCAT('%',UPPER(#{item}),'%')
+		          </foreach>
+		      </when>
+		    </choose>
+		                                            )
+		                                      )
+		                   )
+		</if>
+		<if test="supplyCompCd != null and supplyCompCd  != ''">
+		AND A.NOTICE_SQ IN (
+		                    SELECT NOTICE_SQ
+		                    FROM TB_NOTICE_GOODS
+		                    WHERE GOODS_CD IN (
+		                                       SELECT GOODS_CD 
+		                                       FROM TB_GOODS 
+		                                       WHERE SUPPLY_COMP_CD = #{supplyCompCd}
+		                                       <if test="brandCd != null and brandCd  != ''">
+		                                       AND BRAND_CD = #{brandCd} 
+		                                       </if>
+		                                      )
+		                   )
+		</if>
+		ORDER  BY A.NOTICE_SQ DESC
+	</select>
+	
+	<!-- 상품상세 공지사항 상품 목록 -->
+	<select id="getNoticeGoodsList" parameterType="Notice" resultType="NoticeGoods">
+		/* TsaGoods.getNoticeGoodsList */
+		SELECT A.NOTICE_SQ
+		     , A.GOODS_CD
+		     , B.GOODS_NM
+		FROM TB_NOTICE_GOODS A
+		INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		WHERE NOTICE_SQ = #{noticeSq}
+		ORDER BY A.GOODS_CD
+	</select>
+	
+	<!-- 상품상세 공지사항 상품저장 -->
+	<insert id="saveNoticeGoods" parameterType="NoticeGoods">
+		/* TsaGoods.saveNoticeGoods */
+		INSERT INTO TB_NOTICE_GOODS (
+		       NOTICE_SQ
+		     , GOODS_CD
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{noticeSq}
+		     , #{goodsCd}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       GOODS_CD = #{goodsCd}
+	</insert>
+	
+	<!-- 상품상세 공지사항 상품 삭제 -->
+	<delete id="deleteNoticeGoods" parameterType="NoticeGoods">
+		/* TsaGoods.deleteNoticeGoods */
+		DELETE FROM TB_NOTICE_GOODS 
+		WHERE NOICE_SQ =  #{noiceSq}
+		AND GOODS_CD = #{goodsCd}
+	</delete>
+	
 </mapper>

+ 212 - 212
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaLogin.xml

@@ -1,213 +1,213 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaLoginDao">
-
-	<!-- ID로 사용자 조회 -->
-	<select id="getUserById" parameterType="String" resultType="User">
-		/* TsaLogin.getUserById */
-		SELECT USER_NO                                                     /*사용자명*/
-		     , USER_ID                                                     /*사용자ID*/
-		     , USER_NM                                                     /*사용자명*/
-		     , PASSWD                                                      /*비밀번호*/
-		     , ROLE_CD                                                     /*권한코드*/
-		     , FN_GET_CODE_NM('G001',ROLE_CD)            AS ROLE_NM        /*권한명*/
-		     , ROLE_REF_VAL                                                /*권한관련값*/
-		     , CASE WHEN SUBSTR(ROLE_CD,1,1) IN ('A','B','E') THEN
-		                ROLE_REF_VAL
-		            END                                  AS SUPPLY_COMP_CD /*공급업체코드
-		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) IN ('A','B','E') THEN
-		                (SELECT SUPPLY_COMP_NM
-		                 FROM   TB_SUPPLY_COMPANY
-		                 WHERE  SUPPLY_COMP_CD = A.ROLE_REF_VAL
-		                )
-		       END                                       AS SUPPLY_COMP_NM /*공급업체명*/
-		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'C' THEN
-		                ROLE_REF_VAL
-		       END                                       AS VENDOR_ID      /*벤더ID*/
-		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'C' THEN
-		                FN_GET_CODE_NM('G003',ROLE_REF_VAL)
-		       END                                       AS VENDOR_NM      /*벤더명*/
-		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'D' THEN
-		                ROLE_REF_VAL
-		       END                                       AS AF_LINK_CD     /*제휴링크코드*/
-		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'D' THEN
-		                (SELECT AF_LINK_NM
-		                 FROM   TB_AF_LINK
-		                 WHERE  AF_LINK_CD = A.ROLE_REF_VAL
-		                )
-		       END                                       AS AF_LINK_NM     /*제휴링크명*/
-		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'D' THEN
-		                (SELECT AF_CHANNEL
-		                 FROM   TB_AF_LINK
-		                 WHERE  AF_LINK_CD = A.ROLE_REF_VAL
-		                )
-		       END                                       AS AF_CHANNEL     /*제휴채널*/
-		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'D' THEN
-		                (SELECT FN_GET_CODE_NM('G053',AL.AF_CHANNEL)
-		                 FROM   TB_AF_LINK AL
-		                 WHERE  AL.AF_LINK_CD = A.ROLE_REF_VAL
-		                )
-		       END                                       AS AF_CHANNEL_NM  /*제휴채널명*/
-		     , EMAIL                                                       /*이메일*/
-		     , CELL_PHNNO                                                  /*휴대전화번호*/
-		     , PNT_ASSIGN_AMT                                              /*포인트부여가능금액*/
-		     , IP_ADDR                                                     /*IP주소*/
-		     , IP_CHK_YN                                                   /*IP체크여부*/
-		     , DATE_FORMAT(PASSWD_CHG_DT,'%Y%m%d%H%i%S') AS PASSWD_CHG_DT  /*비밀번호변경일시*/
-		FROM   TB_USER A
-		WHERE  USER_ID = #{userId}
-		AND    USE_YN = 'Y'
-	</select>
-	
-	<!-- 로그인실패 남기기 -->
-	<insert id="createLoginFail" parameterType="User">
-		/* TsaLogin.createLoginFail */
-		INSERT INTO TB_USER_LOGIN_FAIL (
-		       USER_NO
-		     , IP_ADDR
-		     , LOGIN_FAIL_CNT
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{userNo}
-		     , #{ipAddr}
-		     , 1
-		     , #{userNo}
-		     , NOW()
-		     , #{userNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       LOGIN_FAIL_CNT = CASE WHEN #{loginFailYn} = 'Y' THEN LOGIN_FAIL_CNT + 1 ELSE 0 END
-		     , UPD_NO = #{userNo}
-		     , UPD_DT = NOW()
-	</insert>
-
-	<!-- 로그인 실패건수 조회 -->
-	<select id="getLoginFailCount" parameterType="User" resultType="int">
-		/* TsaLogin.getLoginFailCount */
-		SELECT IFNULL((SELECT LOGIN_FAIL_CNT
-		               FROM   TB_USER_LOGIN_FAIL
-		               WHERE  USER_NO = #{userNo}
-		               AND    IP_ADDR = #{ipAddr}
-		              ),0) AS CNT
-		FROM   DUAL
-	</select>
-
-	<!-- 최종로그인일시 Update -->
-	<update id="updateLastLoginDate" parameterType="Integer">
-		/* TsaLogin.updateLastLoginDate */
-		UPDATE TB_USER
-		SET    LOGIN_LDT = NOW()
-		     , UPD_NO = #{userNo}
-		     , UPD_DT = NOW()
-		WHERE  USER_NO = #{userNo}
-	</update>
-
-	<!-- 로그인이력 남기기 -->
-	<insert id="createLoginHistory" parameterType="User">
-		/* TsaLogin.createLoginHistory */
-		INSERT INTO TB_USER_LOGIN_HST (
-		       USER_LOGIN_SQ
-		     , USER_NO
-		     , IP_ADDR
-		     , LOGIN_DT
-		     , REG_NO
-		     , REG_DT
-		)
-		VALUES (
-		       NULL
-		     , #{userNo}
-		     , #{ipAddr}
-		     , NOW()
-		     , #{userNo}
-		     , NOW()
-		)
-	</insert>
-
-	<!-- 로그인 메뉴 목록 -->
-	<select id="getLoginMenuList" parameterType="Integer" resultType="Menu">
-		/* TsaLogin.getLoginMenuList */
-		WITH RECURSIVE CONNECTBY2 AS (
-		    WITH RECURSIVE CONNECTBY1 AS (
-		        SELECT 1                                                  AS MENU_LVL
-		             , PMENU_ID
-		             , MENU_ID
-		             , MENU_NM
-		             , MENU_NM                                            AS NAVIGATION
-		             , MENU_GB
-		             , MENU_DESC
-		             , MENU_URL
-		             , CONCAT(MENU_ID,LPAD(CAST(DISP_ORD AS CHAR),4,'0')) AS DISP_ORD
-		        FROM   TB_MENU
-		        WHERE  PMENU_ID = 'ROOT'
-		        AND    USE_YN = 'Y'
-		        
-		        UNION ALL
-		        
-		        SELECT A.MENU_LVL + 1                                          AS MENU_LVL
-		             , B.PMENU_ID
-		             , B.MENU_ID
-		             , B.MENU_NM
-		             , CONCAT(A.NAVIGATION,' > ',B.MENU_NM)                    AS NAVIGATION
-		             , B.MENU_GB
-		             , B.MENU_DESC
-		             , B.MENU_URL
-		             , CONCAT(A.DISP_ORD,LPAD(CAST(B.DISP_ORD AS CHAR),4,'0')) AS DISP_ORD
-		        FROM   CONNECTBY1 A
-		        INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
-		                            AND B.USE_YN = 'Y'
-		    )
-		    SELECT MENU_LVL
-		         , PMENU_ID
-		         , MENU_ID
-		         , MENU_NM
-		         , NAVIGATION
-		         , MENU_GB
-		         , MENU_DESC
-		         , MENU_URL
-		         , DISP_ORD
-		    FROM   CONNECTBY1
-		    WHERE  MENU_ID IN (SELECT MENU_ID
-		                       FROM   TB_USER_MENU
-		                       WHERE  USER_NO = #{userNo}
-		                       AND    USE_ROLE != 'NNNN'
-		                      )
-		    
-		    UNION ALL
-		    
-		    SELECT B.MENU_LVL
-		         , B.PMENU_ID
-		         , B.MENU_ID
-		         , B.MENU_NM
-		         , B.NAVIGATION
-		         , B.MENU_GB
-		         , B.MENU_DESC
-		         , B.MENU_URL
-		         , B.DISP_ORD
-		    FROM   CONNECTBY2 A
-		    INNER JOIN CONNECTBY1 B ON A.PMENU_ID = B.MENU_ID
-		)
-		SELECT DISTINCT
-		       PMENU_ID               /*상위메뉴ID*/
-		     , MENU_ID                /*메뉴ID*/
-		     , MENU_NM                /*메뉴명*/
-		     , NAVIGATION             /*네비게이션*/
-		     , MENU_DESC              /*메뉴설명*/
-		     , MENU_URL               /*메뉴URL*/
-		     , MENU_LVL               /*메뉴레벨*/
-		     , CASE WHEN IFNULL((SELECT MAX(MENU_LVL)
-		                         FROM   CONNECTBY2
-		                         WHERE  PMENU_ID = A.MENU_ID
-		                        ),0) > 0 THEN 1
-		            ELSE 0
-		       END        AS LEAF_LVL /*말단레벨*/
-		FROM   CONNECTBY2 A
-		WHERE  MENU_ID NOT LIKE 'P%' /*팝업메뉴제외*/
-		ORDER  BY DISP_ORD
-	</select>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaLoginDao">
+
+	<!-- ID로 사용자 조회 -->
+	<select id="getUserById" parameterType="String" resultType="User">
+		/* TsaLogin.getUserById */
+		SELECT USER_NO                                                     /*사용자명*/
+		     , USER_ID                                                     /*사용자ID*/
+		     , USER_NM                                                     /*사용자명*/
+		     , PASSWD                                                      /*비밀번호*/
+		     , ROLE_CD                                                     /*권한코드*/
+		     , FN_GET_CODE_NM('G001',ROLE_CD)            AS ROLE_NM        /*권한명*/
+		     , ROLE_REF_VAL                                                /*권한관련값*/
+		     , CASE WHEN SUBSTR(ROLE_CD,1,1) IN ('A','B','E') THEN
+		                ROLE_REF_VAL
+		            END                                  AS SUPPLY_COMP_CD /*공급업체코드
+		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) IN ('A','B','E') THEN
+		                (SELECT SUPPLY_COMP_NM
+		                 FROM   TB_SUPPLY_COMPANY
+		                 WHERE  SUPPLY_COMP_CD = A.ROLE_REF_VAL
+		                )
+		       END                                       AS SUPPLY_COMP_NM /*공급업체명*/
+		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'C' THEN
+		                ROLE_REF_VAL
+		       END                                       AS VENDOR_ID      /*벤더ID*/
+		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'C' THEN
+		                FN_GET_CODE_NM('G003',ROLE_REF_VAL)
+		       END                                       AS VENDOR_NM      /*벤더명*/
+		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'D' THEN
+		                ROLE_REF_VAL
+		       END                                       AS AF_LINK_CD     /*제휴링크코드*/
+		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'D' THEN
+		                (SELECT AF_LINK_NM
+		                 FROM   TB_AF_LINK
+		                 WHERE  AF_LINK_CD = A.ROLE_REF_VAL
+		                )
+		       END                                       AS AF_LINK_NM     /*제휴링크명*/
+		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'D' THEN
+		                (SELECT AF_CHANNEL
+		                 FROM   TB_AF_LINK
+		                 WHERE  AF_LINK_CD = A.ROLE_REF_VAL
+		                )
+		       END                                       AS AF_CHANNEL     /*제휴채널*/
+		     , CASE WHEN SUBSTRING(ROLE_CD,1,1) = 'D' THEN
+		                (SELECT FN_GET_CODE_NM('G053',AL.AF_CHANNEL)
+		                 FROM   TB_AF_LINK AL
+		                 WHERE  AL.AF_LINK_CD = A.ROLE_REF_VAL
+		                )
+		       END                                       AS AF_CHANNEL_NM  /*제휴채널명*/
+		     , EMAIL                                                       /*이메일*/
+		     , CELL_PHNNO                                                  /*휴대전화번호*/
+		     , PNT_ASSIGN_AMT                                              /*포인트부여가능금액*/
+		     , IP_ADDR                                                     /*IP주소*/
+		     , IP_CHK_YN                                                   /*IP체크여부*/
+		     , DATE_FORMAT(PASSWD_CHG_DT,'%Y%m%d%H%i%S') AS PASSWD_CHG_DT  /*비밀번호변경일시*/
+		FROM   TB_USER A
+		WHERE  USER_ID = #{userId}
+		AND    USE_YN = 'Y'
+	</select>
+	
+	<!-- 로그인실패 남기기 -->
+	<insert id="createLoginFail" parameterType="User">
+		/* TsaLogin.createLoginFail */
+		INSERT INTO TB_USER_LOGIN_FAIL (
+		       USER_NO
+		     , IP_ADDR
+		     , LOGIN_FAIL_CNT
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{userNo}
+		     , #{ipAddr}
+		     , 1
+		     , #{userNo}
+		     , NOW()
+		     , #{userNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       LOGIN_FAIL_CNT = CASE WHEN #{loginFailYn} = 'Y' THEN LOGIN_FAIL_CNT + 1 ELSE 0 END
+		     , UPD_NO = #{userNo}
+		     , UPD_DT = NOW()
+	</insert>
+
+	<!-- 로그인 실패건수 조회 -->
+	<select id="getLoginFailCount" parameterType="User" resultType="int">
+		/* TsaLogin.getLoginFailCount */
+		SELECT IFNULL((SELECT LOGIN_FAIL_CNT
+		               FROM   TB_USER_LOGIN_FAIL
+		               WHERE  USER_NO = #{userNo}
+		               AND    IP_ADDR = #{ipAddr}
+		              ),0) AS CNT
+		FROM   DUAL
+	</select>
+
+	<!-- 최종로그인일시 Update -->
+	<update id="updateLastLoginDate" parameterType="Integer">
+		/* TsaLogin.updateLastLoginDate */
+		UPDATE TB_USER
+		SET    LOGIN_LDT = NOW()
+		     , UPD_NO = #{userNo}
+		     , UPD_DT = NOW()
+		WHERE  USER_NO = #{userNo}
+	</update>
+
+	<!-- 로그인이력 남기기 -->
+	<insert id="createLoginHistory" parameterType="User">
+		/* TsaLogin.createLoginHistory */
+		INSERT INTO TB_USER_LOGIN_HST (
+		       USER_LOGIN_SQ
+		     , USER_NO
+		     , IP_ADDR
+		     , LOGIN_DT
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       NULL
+		     , #{userNo}
+		     , #{ipAddr}
+		     , NOW()
+		     , #{userNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 로그인 메뉴 목록 -->
+	<select id="getLoginMenuList" parameterType="Integer" resultType="Menu">
+		/* TsaLogin.getLoginMenuList */
+		WITH RECURSIVE CONNECTBY2 AS (
+		    WITH RECURSIVE CONNECTBY1 AS (
+		        SELECT 1                                                  AS MENU_LVL
+		             , PMENU_ID
+		             , MENU_ID
+		             , MENU_NM
+		             , MENU_NM                                            AS NAVIGATION
+		             , MENU_GB
+		             , MENU_DESC
+		             , MENU_URL
+		             , CONCAT(MENU_ID,LPAD(CAST(DISP_ORD AS CHAR),4,'0')) AS DISP_ORD
+		        FROM   TB_MENU
+		        WHERE  PMENU_ID = 'ROOT'
+		        AND    USE_YN = 'Y'
+		        
+		        UNION ALL
+		        
+		        SELECT A.MENU_LVL + 1                                          AS MENU_LVL
+		             , B.PMENU_ID
+		             , B.MENU_ID
+		             , B.MENU_NM
+		             , CONCAT(A.NAVIGATION,' > ',B.MENU_NM)                    AS NAVIGATION
+		             , B.MENU_GB
+		             , B.MENU_DESC
+		             , B.MENU_URL
+		             , CONCAT(A.DISP_ORD,LPAD(CAST(B.DISP_ORD AS CHAR),4,'0')) AS DISP_ORD
+		        FROM   CONNECTBY1 A
+		        INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
+		                            AND B.USE_YN = 'Y'
+		    )
+		    SELECT MENU_LVL
+		         , PMENU_ID
+		         , MENU_ID
+		         , MENU_NM
+		         , NAVIGATION
+		         , MENU_GB
+		         , MENU_DESC
+		         , MENU_URL
+		         , DISP_ORD
+		    FROM   CONNECTBY1
+		    WHERE  MENU_ID IN (SELECT MENU_ID
+		                       FROM   TB_USER_MENU
+		                       WHERE  USER_NO = #{userNo}
+		                       AND    USE_ROLE != 'NNNN'
+		                      )
+		    
+		    UNION ALL
+		    
+		    SELECT B.MENU_LVL
+		         , B.PMENU_ID
+		         , B.MENU_ID
+		         , B.MENU_NM
+		         , B.NAVIGATION
+		         , B.MENU_GB
+		         , B.MENU_DESC
+		         , B.MENU_URL
+		         , B.DISP_ORD
+		    FROM   CONNECTBY2 A
+		    INNER JOIN CONNECTBY1 B ON A.PMENU_ID = B.MENU_ID
+		)
+		SELECT DISTINCT
+		       PMENU_ID               /*상위메뉴ID*/
+		     , MENU_ID                /*메뉴ID*/
+		     , MENU_NM                /*메뉴명*/
+		     , NAVIGATION             /*네비게이션*/
+		     , MENU_DESC              /*메뉴설명*/
+		     , MENU_URL               /*메뉴URL*/
+		     , MENU_LVL               /*메뉴레벨*/
+		     , CASE WHEN IFNULL((SELECT MAX(MENU_LVL)
+		                         FROM   CONNECTBY2
+		                         WHERE  PMENU_ID = A.MENU_ID
+		                        ),0) > 0 THEN 1
+		            ELSE 0
+		       END        AS LEAF_LVL /*말단레벨*/
+		FROM   CONNECTBY2 A
+		WHERE  MENU_ID NOT LIKE 'P%' /*팝업메뉴제외*/
+		ORDER  BY DISP_ORD
+	</select>
+
 </mapper>

+ 174 - 174
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaNotice.xml

@@ -1,175 +1,175 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaNoticeDao">
-
-	<!-- 공지사항 목록 -->
-	<select id="getNoticeList" parameterType="Notice" resultType="Notice">
-		/* TsaNotice.getNoticeList */
-		SELECT A.NOTICE_SQ                                         /*공지번호*/
-		     , A.NOTICE_TYPE                                       /*공지유형*/
-		     , A.URGENT_YN                                         /*긴급여부*/
-		     , A.NOTICE_TITLE                                      /*공지제목*/
-		     , A.NOTICE_CONTENT                                    /*공지내용*/
-		     , IFNULL((SELECT COUNT(*)
-		               FROM   TB_NOTICE_FILE
-		               WHERE  NOTICE_SQ = A.NOTICE_SQ
-		              ),0)                          AS FILE_CNT    /*파일건수*/
-		     , DATE_FORMAT(A.NOTICE_STDT,'%Y%m%d')  AS NOTICE_STDT /*공지시작일자*/
-		     , DATE_FORMAT(A.NOTICE_EDDT,'%Y%m%d')  AS NOTICE_EDDT /*공지종료일자*/
-		     , A.USE_YN                                            /*사용여부*/
-		     , A.READ_CNT                                          /*조회수*/
-		     , FN_GET_USER_NM(A.REG_NO)             AS REG_NM      /*등록자*/
-		     , DATE_FORMAT(A.REG_DT,'%Y%m%d%H%i%S') AS REG_DT      /*등록일시*/
-		     , FN_GET_USER_NM(A.UPD_NO)             AS UPD_NM      /*수정자*/
-		     , DATE_FORMAT(A.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT      /*수정일시*/
-		FROM   TB_NOTICE A
-		WHERE  A.NOTICE_TYPE = #{noticeType}
-		<if test="startDt != null and startDt !=''">
-		AND    A.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{startDt},'%Y-%m-%d')
-		</if>
-		<if test="startDt != null and startDt !='' and endDt != null and endDt != ''">
-		AND    A.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'),INTERVAL 1 DAY)
-		</if>
-		<if test='useYn != null and useYn !=""'>
-		AND    A.USE_YN = #{useYn}
-		</if>
-		<if test="noticeTitle != null and noticeTitle !=''">
-		AND    LOWER(A.NOTICE_TITLE) LIKE CONCAT('%',LOWER(#{noticeTitle}),'%')
-		</if>
-		<if test='receiverId != null and receiverId !=""'>
-		AND    A.NOTICE_SQ IN (SELECT NOTICE_SQ
-		                       FROM   TB_NOTICE_RECEIVER
-		                       WHERE  RECEIVER_ID = #{receiverId}
-		                      )
-		</if>
-		ORDER  BY A.URGENT_YN DESC, A.NOTICE_SQ DESC
-	</select>
-
-	<!-- 공지사항 수신자 목록 -->
-	<select id="getNoticeReceiverList" parameterType="Integer" resultType="Notice">
-		/* TsaNotice.getNoticeReceiverList */
-		SELECT RECEIVER_ID
-		FROM   TB_NOTICE_RECEIVER
-		WHERE  NOTICE_SQ = #{noticeSq}
-	</select>
-
-	<!-- 공지사항 파일 목록 -->
-	<select id="getNoticeFileList" parameterType="Integer" resultType="Notice">
-		/* TsaNotice.getNoticeFileList */
-		SELECT NOTICE_SQ
-		     , SEQ
-		     , ORG_FILE_NM
-		     , SYS_FILE_NM
-		FROM   TB_NOTICE_FILE
-		WHERE  NOTICE_SQ = #{noticeSq}
-	</select>
-
-	<!-- 공지사항 저장 -->
-	<insert id="createNotice" parameterType="Notice" keyProperty="noticeSq">
-		/* TsaNotice.createNotice */
-		INSERT INTO TB_NOTICE (
-		       NOTICE_SQ
-		     , NOTICE_TYPE
-		     , NOTICE_TITLE
-		     , NOTICE_STDT
-		     , NOTICE_EDDT
-		     , NOTICE_CONTENT
-		     , URGENT_YN
-		     , USE_YN
-		     , READ_CNT
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       NULL
-		     , #{noticeType}
-		     , #{noticeTitle}
-		     , STR_TO_DATE(#{noticeStdt},'%Y-%m-%d')
-		     , STR_TO_DATE(#{noticeEddt},'%Y-%m-%d')
-		     , #{noticeContent}
-		     , IFNULL(#{urgentYn},'N')
-		     , #{useYn}
-		     , IFNULL(#{readCnt},0)
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-	</insert>
-
-	<!-- 공지사항 수정 -->
-	<update id="updateNotice" parameterType="Notice">
-		/* TsaNotice.updateNotice */
-		UPDATE TB_NOTICE
-		SET    NOTICE_TITLE = #{noticeTitle}
-		     , NOTICE_CONTENT = #{noticeContent}
-		     , NOTICE_STDT = STR_TO_DATE(#{noticeStdt},'%Y-%m-%d')
-		     , NOTICE_EDDT = STR_TO_DATE(#{noticeEddt},'%Y-%m-%d')
-		     , URGENT_YN = IFNULL(#{urgentYn},'N')
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  NOTICE_SQ = #{noticeSq}
-	</update>
-
-	<!-- 공지사항 수신자 삭제 -->
-	<delete id="deleteNoticeReceiver" parameterType="Notice">
-		/* TsaNotice.deleteNoticeReceiver */
-		DELETE FROM TB_NOTICE_RECEIVER
-		WHERE  NOTICE_SQ = #{noticeSq}
-	</delete>
-
-	<!--공지사항 수신자 등록 -->
-	<insert id="createNoticeReceiver" parameterType="Notice">
-		/* TsaNotice.createNoticeReceiver */
-		INSERT INTO TB_NOTICE_RECEIVER (
-		       NOTICE_SQ
-		     , RECEIVER_ID
-		     , REG_NO
-		     , REG_DT
-		)
-		VALUES (
-		       #{noticeSq}
-		     , #{receiverId}
-		     , #{regNo}
-		     , NOW()
-		)
-	</insert>
-
-	<!-- 공지사항 파일 삭제 -->
-	<delete id="deleteNoticeFile" parameterType="Notice">
-		/* TsaNotice.deleteNoticeFile */
-		DELETE FROM TB_NOTICE_FILE
-		WHERE  NOTICE_SQ = #{noticeSq}
-		<if test="seq != null and seq !=''">
-		AND    SEQ = #{seq}
-		</if>
-	</delete>
-
-	<!-- 공지사항 파일 저장 -->
-	<insert id="createNoitceFlie" parameterType="Notice">
-		/* TsaNotice.createNoitceFlie */
-		INSERT INTO TB_NOTICE_FILE (
-		       NOTICE_SQ
-		     , SEQ
-		     , ORG_FILE_NM
-		     , SYS_FILE_NM
-		     , REG_NO
-		     , REG_DT
-		)
-		VALUES (
-		       #{noticeSq}
-		     , IFNULL((SELECT MAX(SEQ)
-		               FROM   TB_NOTICE_FILE
-		               WHERE  NOTICE_SQ = #{noticeSq}
-		              ),0) + 1
-		     , #{orgFileNm}
-		     , #{sysFileNm}
-		     , #{regNo}
-		     , NOW()
-		)
-	</insert>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaNoticeDao">
+
+	<!-- 공지사항 목록 -->
+	<select id="getNoticeList" parameterType="Notice" resultType="Notice">
+		/* TsaNotice.getNoticeList */
+		SELECT A.NOTICE_SQ                                         /*공지번호*/
+		     , A.NOTICE_TYPE                                       /*공지유형*/
+		     , A.URGENT_YN                                         /*긴급여부*/
+		     , A.NOTICE_TITLE                                      /*공지제목*/
+		     , A.NOTICE_CONTENT                                    /*공지내용*/
+		     , IFNULL((SELECT COUNT(*)
+		               FROM   TB_NOTICE_FILE
+		               WHERE  NOTICE_SQ = A.NOTICE_SQ
+		              ),0)                          AS FILE_CNT    /*파일건수*/
+		     , DATE_FORMAT(A.NOTICE_STDT,'%Y%m%d')  AS NOTICE_STDT /*공지시작일자*/
+		     , DATE_FORMAT(A.NOTICE_EDDT,'%Y%m%d')  AS NOTICE_EDDT /*공지종료일자*/
+		     , A.USE_YN                                            /*사용여부*/
+		     , A.READ_CNT                                          /*조회수*/
+		     , FN_GET_USER_NM(A.REG_NO)             AS REG_NM      /*등록자*/
+		     , DATE_FORMAT(A.REG_DT,'%Y%m%d%H%i%S') AS REG_DT      /*등록일시*/
+		     , FN_GET_USER_NM(A.UPD_NO)             AS UPD_NM      /*수정자*/
+		     , DATE_FORMAT(A.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT      /*수정일시*/
+		FROM   TB_NOTICE A
+		WHERE  A.NOTICE_TYPE = #{noticeType}
+		<if test="startDt != null and startDt !=''">
+		AND    A.REG_DT <![CDATA[>=]]> STR_TO_DATE(#{startDt},'%Y-%m-%d')
+		</if>
+		<if test="startDt != null and startDt !='' and endDt != null and endDt != ''">
+		AND    A.REG_DT <![CDATA[<]]> DATE_ADD(STR_TO_DATE(#{endDt},'%Y-%m-%d'),INTERVAL 1 DAY)
+		</if>
+		<if test='useYn != null and useYn !=""'>
+		AND    A.USE_YN = #{useYn}
+		</if>
+		<if test="noticeTitle != null and noticeTitle !=''">
+		AND    LOWER(A.NOTICE_TITLE) LIKE CONCAT('%',LOWER(#{noticeTitle}),'%')
+		</if>
+		<if test='receiverId != null and receiverId !=""'>
+		AND    A.NOTICE_SQ IN (SELECT NOTICE_SQ
+		                       FROM   TB_NOTICE_RECEIVER
+		                       WHERE  RECEIVER_ID = #{receiverId}
+		                      )
+		</if>
+		ORDER  BY A.URGENT_YN DESC, A.NOTICE_SQ DESC
+	</select>
+
+	<!-- 공지사항 수신자 목록 -->
+	<select id="getNoticeReceiverList" parameterType="Integer" resultType="Notice">
+		/* TsaNotice.getNoticeReceiverList */
+		SELECT RECEIVER_ID
+		FROM   TB_NOTICE_RECEIVER
+		WHERE  NOTICE_SQ = #{noticeSq}
+	</select>
+
+	<!-- 공지사항 파일 목록 -->
+	<select id="getNoticeFileList" parameterType="Integer" resultType="Notice">
+		/* TsaNotice.getNoticeFileList */
+		SELECT NOTICE_SQ
+		     , SEQ
+		     , ORG_FILE_NM
+		     , SYS_FILE_NM
+		FROM   TB_NOTICE_FILE
+		WHERE  NOTICE_SQ = #{noticeSq}
+	</select>
+
+	<!-- 공지사항 저장 -->
+	<insert id="createNotice" parameterType="Notice" keyProperty="noticeSq">
+		/* TsaNotice.createNotice */
+		INSERT INTO TB_NOTICE (
+		       NOTICE_SQ
+		     , NOTICE_TYPE
+		     , NOTICE_TITLE
+		     , NOTICE_STDT
+		     , NOTICE_EDDT
+		     , NOTICE_CONTENT
+		     , URGENT_YN
+		     , USE_YN
+		     , READ_CNT
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       NULL
+		     , #{noticeType}
+		     , #{noticeTitle}
+		     , STR_TO_DATE(#{noticeStdt},'%Y-%m-%d')
+		     , STR_TO_DATE(#{noticeEddt},'%Y-%m-%d')
+		     , #{noticeContent}
+		     , IFNULL(#{urgentYn},'N')
+		     , #{useYn}
+		     , IFNULL(#{readCnt},0)
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 공지사항 수정 -->
+	<update id="updateNotice" parameterType="Notice">
+		/* TsaNotice.updateNotice */
+		UPDATE TB_NOTICE
+		SET    NOTICE_TITLE = #{noticeTitle}
+		     , NOTICE_CONTENT = #{noticeContent}
+		     , NOTICE_STDT = STR_TO_DATE(#{noticeStdt},'%Y-%m-%d')
+		     , NOTICE_EDDT = STR_TO_DATE(#{noticeEddt},'%Y-%m-%d')
+		     , URGENT_YN = IFNULL(#{urgentYn},'N')
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  NOTICE_SQ = #{noticeSq}
+	</update>
+
+	<!-- 공지사항 수신자 삭제 -->
+	<delete id="deleteNoticeReceiver" parameterType="Notice">
+		/* TsaNotice.deleteNoticeReceiver */
+		DELETE FROM TB_NOTICE_RECEIVER
+		WHERE  NOTICE_SQ = #{noticeSq}
+	</delete>
+
+	<!--공지사항 수신자 등록 -->
+	<insert id="createNoticeReceiver" parameterType="Notice">
+		/* TsaNotice.createNoticeReceiver */
+		INSERT INTO TB_NOTICE_RECEIVER (
+		       NOTICE_SQ
+		     , RECEIVER_ID
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       #{noticeSq}
+		     , #{receiverId}
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 공지사항 파일 삭제 -->
+	<delete id="deleteNoticeFile" parameterType="Notice">
+		/* TsaNotice.deleteNoticeFile */
+		DELETE FROM TB_NOTICE_FILE
+		WHERE  NOTICE_SQ = #{noticeSq}
+		<if test="seq != null and seq !=''">
+		AND    SEQ = #{seq}
+		</if>
+	</delete>
+
+	<!-- 공지사항 파일 저장 -->
+	<insert id="createNoitceFlie" parameterType="Notice">
+		/* TsaNotice.createNoitceFlie */
+		INSERT INTO TB_NOTICE_FILE (
+		       NOTICE_SQ
+		     , SEQ
+		     , ORG_FILE_NM
+		     , SYS_FILE_NM
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       #{noticeSq}
+		     , IFNULL((SELECT MAX(SEQ)
+		               FROM   TB_NOTICE_FILE
+		               WHERE  NOTICE_SQ = #{noticeSq}
+		              ),0) + 1
+		     , #{orgFileNm}
+		     , #{sysFileNm}
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+
 </mapper>

+ 141 - 141
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaOcm.xml

@@ -1,142 +1,142 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaOcmDao">
-
-	<!-- 외부몰 목록 -->
-	<select id="getExtmallList" parameterType="Extmall" resultType="Extmall">
-		/* TsaOcm.getExtmallList */
-		SELECT VENDOR_ID         /*벤더ID*/
-		     , EXTMALL_ID        /*외부몰ID*/
-		     , EXTMALL_USER_ID   /*외부몰사용자ID*/
-		     , EXTMALL_NM        /*외부몰명*/
-		     , SUPPLY_COMP_CD    /*업체코드*/
-		     , SELL_STORE_CD     /*판매매장코드*/
-		     , STOCK_SELL_RATE   /*재고판매비율*/
-		     , PRICE_ACCEPT_RATE /*가격차이허용율*/
-		     , DWDP_YN           /*직접회수처리여부*/
-		     , USE_YN            /*사용여부*/
-		FROM   TB_EXTMALL A
-		WHERE  1 = 1
-		<if test="vendorId != null and vendorId != ''">
-		AND    VENDOR_ID = #{vendorId}
-		</if>
-		ORDER  BY VENDOR_ID, EXTMALL_ID, EXTMALL_USER_ID
-	</select>
-	
-	<!-- 외부몰 등록/수정 -->
-	<insert id="saveExtmall" parameterType="Extmall">
-		/* TsaOcm.saveExtmall */
-		INSERT INTO TB_EXTMALL (
-		       VENDOR_ID
-		     , EXTMALL_ID
-		     , EXTMALL_USER_ID
-		     , EXTMALL_NM
-		     , SUPPLY_COMP_CD
-		     , SELL_STORE_CD
-		     , STOCK_SELL_RATE
-		     , PRICE_ACCEPT_RATE
-		     , DWDP_YN
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{vendorId}
-		     , #{extmallId}
-		     , #{extmallUserId}
-		     , #{extmallNm}
-		     , #{supplyCompCd}
-		     , #{sellStoreCd}
-		     , IFNULL(#{stockSellRate},0)
-		     , IFNULL(#{priceAcceptRate},0)
-		     , #{dwdpYn}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       EXTMALL_NM = #{extmallNm}
-		     , SUPPLY_COMP_CD = #{supplyCompCd}
-		     , SELL_STORE_CD = #{sellStoreCd}
-		     , STOCK_SELL_RATE = IFNULL(#{stockSellRate},0)
-		     , PRICE_ACCEPT_RATE = IFNULL(#{priceAcceptRate},0)
-		     , DWDP_YN = #{dwdpYn}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
-	<!-- 외부몰고시정보 목록 -->
-	<select id="getExtmallNotiinfoList" parameterType="ExtmallNoti" resultType="ExtmallNoti">
-		/* TsaOcm.getExtmallNotiinfoList */
-		SELECT A.VENDOR_ID                                 /*벤더ID*/
-		     , A.EXTMALL_NI_CLSF_CD                        /*외부몰고시정보분류코드*/
-		     , A.EXTMALL_NI_CLSF_NM                        /*외부몰고시정보분류명*/
-		     , A.EXTMALL_NI_ITEM_CD                        /*외부몰고시정보항목코드*/
-		     , A.EXTMALL_NI_ITEM_NM                        /*외부몰고시정보항목명*/
-		     , CASE WHEN A.NI_CLSF_CD IS NULL THEN
-		                NULL
-		            ELSE
-		                CONCAT('[',A.NI_CLSF_CD,'] ',B.CD_NM)
-		       END                  AS SELFMALL_NI_CLSF_NM /*자사몰정보고시분류명*/
-		     , CASE WHEN A.NI_ITEM_CD IS NULL THEN
-		                NULL
-		            ELSE
-		                CONCAT('[',A.NI_ITEM_CD,'] ',C.CD_NM)
-		       END                  AS SELFMALL_NI_ITEM_NM /*자사몰정보고시항목명*/
-		FROM   TB_EXTMALL_NOTI_INFO A
-		LEFT OUTER JOIN TB_COMMON_CODE B ON A.NI_CLSF_CD = B.CD
-		                                AND B.CD_GB = 'G004'
-		LEFT OUTER JOIN TB_COMMON_CODE C ON A.NI_ITEM_CD = C.CD
-		                                AND C.CD_GB = 'G005'
-		WHERE  A.VENDOR_ID = #{vendorId}
-		ORDER  BY A.EXTMALL_NI_CLSF_CD, A.EXTMALL_NI_ITEM_CD
-	</select>
-	
-	<!-- 외부몰가격연계 목록 -->
-	<select id="getExtmallPriceSyncList" parameterType="ExtmallPriceSync" resultType="ExtmallPriceSync">
-		/* TsaOcm.getExtmallPriceSyncList */
-		SELECT #{vendorId}           AS VENDOR_ID /*벤더ID*/
-		     , A.BRAND_CD                         /*브랜드코드*/
-		     , A.BRAND_KNM                        /*브랜드국문명*/
-		     , A.BRAND_ENM                        /*브랜드영문명*/
-		     , IFNULL(B.SYNC_YN,'N') AS SYNC_YN   /*연계여부*/
-		FROM   TB_BRAND A
-		LEFT OUTER JOIN TB_EXTMALL_PRICE_SYNC B ON A.BRAND_CD = B.BRAND_CD
-		                                       AND B.VENDOR_ID = #{vendorId}
-		WHERE  A.SELF_YN = 'Y' /*자사브랜드만*/
-		ORDER  BY 1, 2
-	</select>
-	
-	<!-- 외부몰가격연계 등록/수정 -->
-	<insert id="saveExtmallPriceSync" parameterType="ExtmallPriceSync">
-		/* TsaOcm.saveExtmallPriceSync */
-		INSERT INTO TB_EXTMALL_PRICE_SYNC (
-		       VENDOR_ID
-		     , BRAND_CD
-		     , SYNC_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{vendorId}
-		     , #{brandCd}
-		     , #{syncYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       SYNC_YN = #{syncYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaOcmDao">
+
+	<!-- 외부몰 목록 -->
+	<select id="getExtmallList" parameterType="Extmall" resultType="Extmall">
+		/* TsaOcm.getExtmallList */
+		SELECT VENDOR_ID         /*벤더ID*/
+		     , EXTMALL_ID        /*외부몰ID*/
+		     , EXTMALL_USER_ID   /*외부몰사용자ID*/
+		     , EXTMALL_NM        /*외부몰명*/
+		     , SUPPLY_COMP_CD    /*업체코드*/
+		     , SELL_STORE_CD     /*판매매장코드*/
+		     , STOCK_SELL_RATE   /*재고판매비율*/
+		     , PRICE_ACCEPT_RATE /*가격차이허용율*/
+		     , DWDP_YN           /*직접회수처리여부*/
+		     , USE_YN            /*사용여부*/
+		FROM   TB_EXTMALL A
+		WHERE  1 = 1
+		<if test="vendorId != null and vendorId != ''">
+		AND    VENDOR_ID = #{vendorId}
+		</if>
+		ORDER  BY VENDOR_ID, EXTMALL_ID, EXTMALL_USER_ID
+	</select>
+	
+	<!-- 외부몰 등록/수정 -->
+	<insert id="saveExtmall" parameterType="Extmall">
+		/* TsaOcm.saveExtmall */
+		INSERT INTO TB_EXTMALL (
+		       VENDOR_ID
+		     , EXTMALL_ID
+		     , EXTMALL_USER_ID
+		     , EXTMALL_NM
+		     , SUPPLY_COMP_CD
+		     , SELL_STORE_CD
+		     , STOCK_SELL_RATE
+		     , PRICE_ACCEPT_RATE
+		     , DWDP_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{vendorId}
+		     , #{extmallId}
+		     , #{extmallUserId}
+		     , #{extmallNm}
+		     , #{supplyCompCd}
+		     , #{sellStoreCd}
+		     , IFNULL(#{stockSellRate},0)
+		     , IFNULL(#{priceAcceptRate},0)
+		     , #{dwdpYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       EXTMALL_NM = #{extmallNm}
+		     , SUPPLY_COMP_CD = #{supplyCompCd}
+		     , SELL_STORE_CD = #{sellStoreCd}
+		     , STOCK_SELL_RATE = IFNULL(#{stockSellRate},0)
+		     , PRICE_ACCEPT_RATE = IFNULL(#{priceAcceptRate},0)
+		     , DWDP_YN = #{dwdpYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 외부몰고시정보 목록 -->
+	<select id="getExtmallNotiinfoList" parameterType="ExtmallNoti" resultType="ExtmallNoti">
+		/* TsaOcm.getExtmallNotiinfoList */
+		SELECT A.VENDOR_ID                                 /*벤더ID*/
+		     , A.EXTMALL_NI_CLSF_CD                        /*외부몰고시정보분류코드*/
+		     , A.EXTMALL_NI_CLSF_NM                        /*외부몰고시정보분류명*/
+		     , A.EXTMALL_NI_ITEM_CD                        /*외부몰고시정보항목코드*/
+		     , A.EXTMALL_NI_ITEM_NM                        /*외부몰고시정보항목명*/
+		     , CASE WHEN A.NI_CLSF_CD IS NULL THEN
+		                NULL
+		            ELSE
+		                CONCAT('[',A.NI_CLSF_CD,'] ',B.CD_NM)
+		       END                  AS SELFMALL_NI_CLSF_NM /*자사몰정보고시분류명*/
+		     , CASE WHEN A.NI_ITEM_CD IS NULL THEN
+		                NULL
+		            ELSE
+		                CONCAT('[',A.NI_ITEM_CD,'] ',C.CD_NM)
+		       END                  AS SELFMALL_NI_ITEM_NM /*자사몰정보고시항목명*/
+		FROM   TB_EXTMALL_NOTI_INFO A
+		LEFT OUTER JOIN TB_COMMON_CODE B ON A.NI_CLSF_CD = B.CD
+		                                AND B.CD_GB = 'G004'
+		LEFT OUTER JOIN TB_COMMON_CODE C ON A.NI_ITEM_CD = C.CD
+		                                AND C.CD_GB = 'G005'
+		WHERE  A.VENDOR_ID = #{vendorId}
+		ORDER  BY A.EXTMALL_NI_CLSF_CD, A.EXTMALL_NI_ITEM_CD
+	</select>
+	
+	<!-- 외부몰가격연계 목록 -->
+	<select id="getExtmallPriceSyncList" parameterType="ExtmallPriceSync" resultType="ExtmallPriceSync">
+		/* TsaOcm.getExtmallPriceSyncList */
+		SELECT #{vendorId}           AS VENDOR_ID /*벤더ID*/
+		     , A.BRAND_CD                         /*브랜드코드*/
+		     , A.BRAND_KNM                        /*브랜드국문명*/
+		     , A.BRAND_ENM                        /*브랜드영문명*/
+		     , IFNULL(B.SYNC_YN,'N') AS SYNC_YN   /*연계여부*/
+		FROM   TB_BRAND A
+		LEFT OUTER JOIN TB_EXTMALL_PRICE_SYNC B ON A.BRAND_CD = B.BRAND_CD
+		                                       AND B.VENDOR_ID = #{vendorId}
+		WHERE  A.SELF_YN = 'Y' /*자사브랜드만*/
+		ORDER  BY 1, 2
+	</select>
+	
+	<!-- 외부몰가격연계 등록/수정 -->
+	<insert id="saveExtmallPriceSync" parameterType="ExtmallPriceSync">
+		/* TsaOcm.saveExtmallPriceSync */
+		INSERT INTO TB_EXTMALL_PRICE_SYNC (
+		       VENDOR_ID
+		     , BRAND_CD
+		     , SYNC_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{vendorId}
+		     , #{brandCd}
+		     , #{syncYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       SYNC_YN = #{syncYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
 </mapper>

+ 364 - 364
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml

@@ -1,365 +1,365 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaRendererDao">
-
-	<!-- 공급업체 목록 -->
-	<select id="getSupplyCompanyList" parameterType="SupplyCompany" resultType="CommonCode">
-		/* TsaRenderer.getSupplyCompanyList */
-		SELECT SUPPLY_COMP_CD  AS CD
-		     , SUPPLY_COMP_NM  AS CD_NM
-		FROM   TB_SUPPLY_COMPANY
-		WHERE  USE_YN = 'Y'
-		<if test='supplyCompCd != null and supplyCompCd != ""'>
-		AND    SUPPLY_COMP_CD = #{supplyCompCd}
-		</if>
-		<if test='selfYn == "Y"'>
-		AND    DISTRIBUTION_GB IN ('G065_10','G065_11','G065_12')
-		</if>
-		<if test='selfYn == "N"'>
-		AND    DISTRIBUTION_GB = 'G065_20'
-		</if>
-		ORDER  BY SUPPLY_COMP_NM
-	</select>
-	
-	<!-- 공통코드 목록 -->
-	<select id="getCommonCodeList" parameterType="CommonCode" resultType="CommonCode">
-		/* TsaRenderer.getCommonCodeList */
-		SELECT CD
-		     , CD_NM
-		FROM   TB_COMMON_CODE
-		WHERE  1 = 1
-		<if test="useYn != null and useYn != ''">
-		AND    USE_YN = #{useYn}
-		</if>
-		AND    CD_GB = #{cdGb}
-		<if test="cd != null and cd != ''">
-		AND    CD = #{cd}
-		</if>
-		<if test="cdNm != null and cdNm != ''">
-		AND    CD_NM = #{cdNm}
-		</if>
-		<if test="cdDesc != null and cdDesc != ''">
-		AND    CD_DESC = #{cdDesc}
-		</if>
-		<if test="exceptCds != null and exceptCds != ''">
-		AND    CD NOT IN
-		    <foreach collection="exceptCds" item="item" index="index"  open="(" close=")" separator=",">
-		    #{item}
-		    </foreach>
-		</if>
-		ORDER  BY CD_GB, DISP_ORD
-	</select>
-	
-	<!-- 최상위메뉴 목록 -->
-	<select id="getTopMenuList" parameterType="String" resultType="CommonCode">
-		/* TsaRenderer.getTopMenuList */
-		WITH RECURSIVE CONNECTBY AS (
-		    SELECT 1                                    AS LVL
-		         , MENU_ID
-		         , MENU_NM
-		         , CONCAT(MENU_ID,LPAD(DISP_ORD,4,'0')) AS ORDBY
-		    FROM   TB_MENU
-		    WHERE  USE_YN = 'Y'
-		    <choose>
-		        <when test="pmenuId != null and pmenuId != ''">
-		    AND    PMENU_ID = #{pmenuId}
-		        </when>
-		        <otherwise>
-		    AND    PMENU_ID = 'ROOT'
-		        </otherwise>
-		    </choose>
-		    
-		    UNION ALL
-		    
-		    SELECT A.LVL + 1                              AS LVL
-		         , B.MENU_ID
-		         , B.MENU_NM
-		         , CONCAT(A.ORDBY,LPAD(B.DISP_ORD,4,'0')) AS ORDBY
-		    FROM   CONNECTBY A
-		    INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
-		    WHERE  B.USE_YN = 'Y'
-		)
-		SELECT MENU_ID AS CD
-		     , MENU_NM AS CD_NM
-		FROM   CONNECTBY
-		WHERE  LVL = 1
-		ORDER  BY ORDBY
-	</select>
-
-	<!-- 전체메뉴 목록 -->
-	<select id="getAllMenuList" resultType="CommonCode">
-		/* TsaRenderer.getAllMenuList */
-		WITH RECURSIVE CONNECTBY AS (
-		    SELECT 1                                    AS LVL
-		         , MENU_ID
-		         , MENU_NM
-		         , MENU_GB
-		         , CONCAT(MENU_ID,LPAD(DISP_ORD,4,'0')) AS ORDBY
-		    FROM   TB_MENU
-		    WHERE  USE_YN = 'Y'
-		    AND    PMENU_ID = 'ROOT'
-		    
-		    UNION ALL
-		    
-		    SELECT A.LVL + 1                              AS LVL
-		         , B.MENU_ID
-		         , B.MENU_NM
-		         , B.MENU_GB
-		         , CONCAT(A.ORDBY,LPAD(B.DISP_ORD,4,'0')) AS ORDBY
-		    FROM   CONNECTBY A
-		           INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
-		    WHERE  B.USE_YN = 'Y'
-		)
-		SELECT MENU_ID                                                 AS CD
-		     , CONCAT(REPEAT('--',(LVL - 1)),'[',MENU_ID,'] ',MENU_NM) AS CD_NM
-		FROM   CONNECTBY
-		WHERE  MENU_GB = 'M'
-		ORDER  BY ORDBY
-	</select>
-
-	<!-- 벤더별 외부몰 목록 -->
-	<select id="getVendorExtmallList" parameterType="String" resultType="CommonCode">
-		/* TsaRenderer.getVendorExtmallList */
-		SELECT DISTINCT
-		       EXTMALL_ID AS CD
-		     , EXTMALL_NM AS CD_NM
-		FROM   TB_EXTMALL
-		WHERE  VENDOR_ID = #{vendorId}
-		AND    USE_YN = 'Y'
-		ORDER  BY EXTMALL_ID
-	</select>
-
-	<!-- 벤더별 외부몰판매매장 목록 -->
-	<select id="getVendorExtmallSellStoreList" parameterType="String" resultType="CommonCode">
-		/* TsaRenderer.getVendorExtmallSellStoreList */
-		SELECT A.SELL_STORE_CD AS CD
-		     , B.SELL_STORE_NM AS CD_NM
-		FROM   TB_EXTMALL A
-		     , TB_SELL_STORE B
-		WHERE  A.SELL_STORE_CD = B.SELL_STORE_CD
-		AND    A.VENDOR_ID = #{vendorId}
-		AND    A.USE_YN = 'Y'
-		AND    B.USE_YN = 'Y'
-		GROUP  BY A.SELL_STORE_CD, B.SELL_STORE_NM
-		ORDER  BY B.SELL_STORE_NM
-	</select>
-
-	<!-- 브랜드 목록 -->
-	<select id="getBrandList" parameterType="Brand" resultType="CommonCode">
-		/* TsaRenderer.getBrandList */
-		SELECT BRAND_CD  AS CD
-		     , BRAND_ENM AS CD_NM
-		FROM   TB_BRAND
-		WHERE  1 = 1
-		<if test='supplyCompCd != null and supplyCompCd != ""'>
-		AND    SUPPLY_COMP_CD = #{supplyCompCd}
-		</if>
-		<if test='brandGrpNm != null and brandGrpNm != ""'>
-		AND    BRAND_GRP_NM = #{brandGrpNm}
-		</if>
-		<if test='useYn != null and useYn != ""'>
-		AND    USE_YN = #{useYn}
-		</if>
-		ORDER  BY SUPPLY_COMP_CD, DISP_ORD
-	</select>
-
-	<!-- 권한별 브랜드 목록 -->
-	<select id="getAuthBrandList" parameterType="int" resultType="CommonCode">
-		/* TsaRenderer.getAuthBrandList */
-		SELECT A.BRAND_CD  AS CD
-		     , A.BRAND_ENM AS CD_NM
-		FROM   TB_BRAND A
-		INNER JOIN TB_BRAND_MD B ON A.BRAND_CD = B.BRAND_CD
-		WHERE  A.USE_YN = 'Y'
-		AND    B.MD_NO = #{userNo}
-		GROUP  BY A.BRAND_CD, A.BRAND_ENM
-		ORDER  BY A.BRAND_CD
-	</select>
-
-	<!-- 출고처 목록 -->
-	<select id="getDeliveryLocList" parameterType="DeliveryLoc" resultType="CommonCode">
-		/* TsaRenderer.getDeliveryLocList */
-		SELECT DELV_LOC_CD AS CD
-		     , DELV_LOC_NM AS CD_NM
-		FROM   TB_DELIVERY_LOC
-		WHERE  USE_YN = 'Y'
-		<if test='supplyCompCd != null and supplyCompCd != ""'>
-		AND    SUPPLY_COMP_CD = #{supplyCompCd}
-		</if>
-		<if test='delvLocClsf != null and delvLocClsf != ""'>
-		AND    DELV_LOC_CLSF = #{delvLocClsf}
-		</if>
-		ORDER  BY DELV_LOC_NM
-	</select>
-
-	<!-- 정보고시 목록 -->
-	<select id="getCateInfoList" parameterType="String" resultType="CommonCode">
-		/* TsaRenderer.getCateInfoList */
-		SELECT NI_CLSF_CD AS CD
-		     , B.CD_NM
-		FROM   TB_NOTI_INFO A
-		INNER JOIN TB_GOODS G ON G.SUPPLY_COMP_CD = A.SUPPLY_COMP_CD
-		INNER JOIN TB_COMMON_CODE B ON A.NI_CLSF_CD = B.CD
-		WHERE  G.GOODS_CD = #{goodsCd}
-		AND    B.CD_GB = 'G004'
-		AND    B.USE_YN = 'Y'
-		GROUP  BY NI_CLSF_CD, B.CD_NM
-		ORDER  BY NI_CLSF_CD
-	</select>
-
-	<!-- 품목 목록 -->
-	<select id="getItemkindList" parameterType="Itemkind" resultType="CommonCode">
-		/* TsaRenderer.getItemkindList */
-		SELECT ITEMKIND_CD AS CD
-		     , ITEMKIND_NM AS CD_NM
-		FROM   TB_ITEMKIND
-		WHERE  USE_YN = 'Y'
-		<if test='itemkindCd != null and itemkindCd != ""'>
-		AND    ITEMKIND_CD = #{itemkindCd}
-		</if>
-		ORDER  BY ITEMKIND_CD
-	</select>
-
-	<!-- 브랜드그룹 목록 -->
-	<select id="getBrandGroupList" resultType="CommonCode">
-		/* TsaRenderer.getBrandGroupList */
-		SELECT BRAND_GRP_NM AS CD
-		     , BRAND_GRP_NM AS CD_NM
-		FROM   TB_BRAND
-		WHERE  USE_YN = 'Y'
-		AND    BRAND_GRP_NM IS NOT NULL
-		GROUP  BY BRAND_GRP_NM
-		ORDER  BY BRAND_GRP_NM
-	</select>
-
-	<!-- 컬러 목록 -->
-	<select id="getColorList" parameterType="Color" resultType="CommonCode">
-		/* TsaRenderer.getColorList */
-		SELECT COLOR_CD  AS CD
-		     , COLOR_ENM AS CD_NM
-		     , COLOR_KNM AS CD_DESC
-		     , USE_YN
-		FROM   TB_COLOR
-		WHERE  USE_YN = 'Y'
-		<if test='colorCd != null and colorCd != ""'>
-		AND    COLOR_CD = #{colorCd}
-		</if>
-		ORDER  BY COLOR_CD
-	</select>
-
-	<!-- 사용중 대카테고리 목록 -->
-	<select id="getTCategoryList" parameterType="String" resultType="CommonCode">
-		/* TsaRenderer.getTCategoryList */
-		SELECT TCATE_CD AS CD
-		     , TCATE_NM AS CD_NM
-		FROM   TB_CATEGORY_4SRCH
-		WHERE  1 = 1
-		<if test='cateGb != null and cateGb != ""'>
-		AND    CATE_GB = #{cateGb}
-		</if>
-		GROUP  BY TCATE_CD, TCATE_NM
-		ORDER  BY TCATE_CD
-	</select>
-
-	<!-- 브랜드에 등록된 MD 목록 -->
-	<select id="getBrandMdList" resultType="CommonCode">
-		/* TsaRenderer.getBrandMdList */
-		SELECT DISTINCT
-		       A.MD_NO   AS CD
-		     , C.USER_NM AS CD_NM
-		FROM   TB_BRAND_MD A
-		INNER JOIN TB_BRAND B ON A.BRAND_CD = B.BRAND_CD
-		INNER JOIN TB_USER C ON A.MD_NO = C.USER_NO
-		ORDER  BY C.USER_NM
-	</select>
-
-	<!-- 택배사명 목록 조회 -->
-	<select id="getShipCompanyList" resultType="CommonCode">
-		/* TsaDelivery.getShipCompanyList */
-		SELECT SHIP_COMP_CD  AS CD
-		     , SHIP_COMP_NM  AS CD_NM
-		FROM   TB_SHIP_COMPANY
-		WHERE  1 = 1
-		<if test='useYn != null and useYn != ""'>
-		AND    USE_YN = #{useYn}
-		</if>
-	</select>
-
-	<!-- MD별 브랜드 목록 조회 -->
-	<select id="getMdBrandList" resultType="CommonCode">
-		/* TsaRenderer.getMdBrandList*/
-		SELECT DISTINCT
-		       A.BRAND_CD AS CD
-		     , B.BRAND_ENM AS CD_NM
-		FROM   TB_BRAND_MD A
-		     , TB_BRAND B
-		WHERE  A.BRAND_CD = B.BRAND_CD
-		<if test='mdNo != null and mdNo != "" and mdNo != "all"'>
-		AND    A.MD_NO = #{mdNo}
-		</if>
-	</select>
-
-	<!-- MD별 브랜드그룹조회 -->
-	<select id="getMdBrandGrpList" resultType="CommonCode">
-		/* TsaRenderer.getMdBrandGrpList*/
-		SELECT DISTINCT
-		       B.BRAND_GRP_NM AS CD
-		     , B.BRAND_GRP_NM AS CD_NM
-		FROM   TB_BRAND_MD A
-		      ,TB_BRAND B
-		WHERE  A.BRAND_CD = B.BRAND_CD
-		<if test='mdNo != null and mdNo != "" and mdNo != "all"'>
-		AND    A.MD_NO = #{mdNo}
-		</if>
-		GROUP  BY BRAND_GRP_NM
-	</select>
-
-	<select id="getInstaAccount" resultType="CommonCode">
-		/* TsaRenderer.getInstaAccount*/
-		SELECT DISTINCT
-		       IT.INSTA_ACCOUNT AS CD
-		     , IT.INSTA_ACCOUNT AS CD_NM
-		FROM   TB_INSTAGRAM_TOKEN IT
-	</select>
-
-	<!-- 판매몰조회 -->
-	<select id="getSellStoreList" resultType="CommonCode">
-		/* TsaRenderer.getSellStoreList*/
-		SELECT DISTINCT
-		       SELL_STORE_CD AS CD
-		     , SELL_STORE_NM AS CD_NM
-		FROM   TB_SELL_STORE
-	</select>
-
-	<!-- 기본답변문구 제목 목록 -->
-	<select id="getBasicAnsTitleList" parameterType="String" resultType="CommonCode">
-		/* TsaRenderer.getBasicAnsTitleList */
-		SELECT ANS_SQ     AS CD
-		     , ANS_TITLE  AS CD_NM
-		FROM   TB_BASIC_ANS
-		WHERE  ANS_CLSF = #{ansClsf}
-		AND    USE_YN = 'Y'
-	</select>
-
-	<!-- 제휴링크 목록 -->
-	<select id="getAflinkList" parameterType="String" resultType="CommonCode">
-		/* TsaRenderer.getAflinkList */
-		SELECT AF_LINK_CD AS CD
-		     , AF_LINK_NM AS CD_NM
-		FROM   TB_AF_LINK
-		WHERE  AF_CHANNEL = #{afChannel}
-		AND    USE_YN = 'Y'
-	</select>
-	
-	<!-- 색상그룹코드 RGB 목록 -->
-	<select id="getColorGrpCdRgbList" resultType="CommonCode">
-		/* TsaRenderer.getColorGrpCdRgbList */
-		SELECT CD
-			 , CD_DESC AS CD_NM
-		FROM TB_COMMON_CODE
-		WHERE 1=1
-		AND CD_GB = 'G072'
-		AND USE_YN = 'Y'
-	</select>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaRendererDao">
+
+	<!-- 공급업체 목록 -->
+	<select id="getSupplyCompanyList" parameterType="SupplyCompany" resultType="CommonCode">
+		/* TsaRenderer.getSupplyCompanyList */
+		SELECT SUPPLY_COMP_CD  AS CD
+		     , SUPPLY_COMP_NM  AS CD_NM
+		FROM   TB_SUPPLY_COMPANY
+		WHERE  USE_YN = 'Y'
+		<if test='supplyCompCd != null and supplyCompCd != ""'>
+		AND    SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		<if test='selfYn == "Y"'>
+		AND    DISTRIBUTION_GB IN ('G065_10','G065_11','G065_12')
+		</if>
+		<if test='selfYn == "N"'>
+		AND    DISTRIBUTION_GB = 'G065_20'
+		</if>
+		ORDER  BY SUPPLY_COMP_NM
+	</select>
+	
+	<!-- 공통코드 목록 -->
+	<select id="getCommonCodeList" parameterType="CommonCode" resultType="CommonCode">
+		/* TsaRenderer.getCommonCodeList */
+		SELECT CD
+		     , CD_NM
+		FROM   TB_COMMON_CODE
+		WHERE  1 = 1
+		<if test="useYn != null and useYn != ''">
+		AND    USE_YN = #{useYn}
+		</if>
+		AND    CD_GB = #{cdGb}
+		<if test="cd != null and cd != ''">
+		AND    CD = #{cd}
+		</if>
+		<if test="cdNm != null and cdNm != ''">
+		AND    CD_NM = #{cdNm}
+		</if>
+		<if test="cdDesc != null and cdDesc != ''">
+		AND    CD_DESC = #{cdDesc}
+		</if>
+		<if test="exceptCds != null and exceptCds != ''">
+		AND    CD NOT IN
+		    <foreach collection="exceptCds" item="item" index="index"  open="(" close=")" separator=",">
+		    #{item}
+		    </foreach>
+		</if>
+		ORDER  BY CD_GB, DISP_ORD
+	</select>
+	
+	<!-- 최상위메뉴 목록 -->
+	<select id="getTopMenuList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getTopMenuList */
+		WITH RECURSIVE CONNECTBY AS (
+		    SELECT 1                                    AS LVL
+		         , MENU_ID
+		         , MENU_NM
+		         , CONCAT(MENU_ID,LPAD(DISP_ORD,4,'0')) AS ORDBY
+		    FROM   TB_MENU
+		    WHERE  USE_YN = 'Y'
+		    <choose>
+		        <when test="pmenuId != null and pmenuId != ''">
+		    AND    PMENU_ID = #{pmenuId}
+		        </when>
+		        <otherwise>
+		    AND    PMENU_ID = 'ROOT'
+		        </otherwise>
+		    </choose>
+		    
+		    UNION ALL
+		    
+		    SELECT A.LVL + 1                              AS LVL
+		         , B.MENU_ID
+		         , B.MENU_NM
+		         , CONCAT(A.ORDBY,LPAD(B.DISP_ORD,4,'0')) AS ORDBY
+		    FROM   CONNECTBY A
+		    INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
+		    WHERE  B.USE_YN = 'Y'
+		)
+		SELECT MENU_ID AS CD
+		     , MENU_NM AS CD_NM
+		FROM   CONNECTBY
+		WHERE  LVL = 1
+		ORDER  BY ORDBY
+	</select>
+
+	<!-- 전체메뉴 목록 -->
+	<select id="getAllMenuList" resultType="CommonCode">
+		/* TsaRenderer.getAllMenuList */
+		WITH RECURSIVE CONNECTBY AS (
+		    SELECT 1                                    AS LVL
+		         , MENU_ID
+		         , MENU_NM
+		         , MENU_GB
+		         , CONCAT(MENU_ID,LPAD(DISP_ORD,4,'0')) AS ORDBY
+		    FROM   TB_MENU
+		    WHERE  USE_YN = 'Y'
+		    AND    PMENU_ID = 'ROOT'
+		    
+		    UNION ALL
+		    
+		    SELECT A.LVL + 1                              AS LVL
+		         , B.MENU_ID
+		         , B.MENU_NM
+		         , B.MENU_GB
+		         , CONCAT(A.ORDBY,LPAD(B.DISP_ORD,4,'0')) AS ORDBY
+		    FROM   CONNECTBY A
+		           INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
+		    WHERE  B.USE_YN = 'Y'
+		)
+		SELECT MENU_ID                                                 AS CD
+		     , CONCAT(REPEAT('--',(LVL - 1)),'[',MENU_ID,'] ',MENU_NM) AS CD_NM
+		FROM   CONNECTBY
+		WHERE  MENU_GB = 'M'
+		ORDER  BY ORDBY
+	</select>
+
+	<!-- 벤더별 외부몰 목록 -->
+	<select id="getVendorExtmallList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getVendorExtmallList */
+		SELECT DISTINCT
+		       EXTMALL_ID AS CD
+		     , EXTMALL_NM AS CD_NM
+		FROM   TB_EXTMALL
+		WHERE  VENDOR_ID = #{vendorId}
+		AND    USE_YN = 'Y'
+		ORDER  BY EXTMALL_ID
+	</select>
+
+	<!-- 벤더별 외부몰판매매장 목록 -->
+	<select id="getVendorExtmallSellStoreList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getVendorExtmallSellStoreList */
+		SELECT A.SELL_STORE_CD AS CD
+		     , B.SELL_STORE_NM AS CD_NM
+		FROM   TB_EXTMALL A
+		     , TB_SELL_STORE B
+		WHERE  A.SELL_STORE_CD = B.SELL_STORE_CD
+		AND    A.VENDOR_ID = #{vendorId}
+		AND    A.USE_YN = 'Y'
+		AND    B.USE_YN = 'Y'
+		GROUP  BY A.SELL_STORE_CD, B.SELL_STORE_NM
+		ORDER  BY B.SELL_STORE_NM
+	</select>
+
+	<!-- 브랜드 목록 -->
+	<select id="getBrandList" parameterType="Brand" resultType="CommonCode">
+		/* TsaRenderer.getBrandList */
+		SELECT BRAND_CD  AS CD
+		     , BRAND_ENM AS CD_NM
+		FROM   TB_BRAND
+		WHERE  1 = 1
+		<if test='supplyCompCd != null and supplyCompCd != ""'>
+		AND    SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		<if test='brandGrpNm != null and brandGrpNm != ""'>
+		AND    BRAND_GRP_NM = #{brandGrpNm}
+		</if>
+		<if test='useYn != null and useYn != ""'>
+		AND    USE_YN = #{useYn}
+		</if>
+		ORDER  BY SUPPLY_COMP_CD, DISP_ORD
+	</select>
+
+	<!-- 권한별 브랜드 목록 -->
+	<select id="getAuthBrandList" parameterType="int" resultType="CommonCode">
+		/* TsaRenderer.getAuthBrandList */
+		SELECT A.BRAND_CD  AS CD
+		     , A.BRAND_ENM AS CD_NM
+		FROM   TB_BRAND A
+		INNER JOIN TB_BRAND_MD B ON A.BRAND_CD = B.BRAND_CD
+		WHERE  A.USE_YN = 'Y'
+		AND    B.MD_NO = #{userNo}
+		GROUP  BY A.BRAND_CD, A.BRAND_ENM
+		ORDER  BY A.BRAND_CD
+	</select>
+
+	<!-- 출고처 목록 -->
+	<select id="getDeliveryLocList" parameterType="DeliveryLoc" resultType="CommonCode">
+		/* TsaRenderer.getDeliveryLocList */
+		SELECT DELV_LOC_CD AS CD
+		     , DELV_LOC_NM AS CD_NM
+		FROM   TB_DELIVERY_LOC
+		WHERE  USE_YN = 'Y'
+		<if test='supplyCompCd != null and supplyCompCd != ""'>
+		AND    SUPPLY_COMP_CD = #{supplyCompCd}
+		</if>
+		<if test='delvLocClsf != null and delvLocClsf != ""'>
+		AND    DELV_LOC_CLSF = #{delvLocClsf}
+		</if>
+		ORDER  BY DELV_LOC_NM
+	</select>
+
+	<!-- 정보고시 목록 -->
+	<select id="getCateInfoList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getCateInfoList */
+		SELECT NI_CLSF_CD AS CD
+		     , B.CD_NM
+		FROM   TB_NOTI_INFO A
+		INNER JOIN TB_GOODS G ON G.SUPPLY_COMP_CD = A.SUPPLY_COMP_CD
+		INNER JOIN TB_COMMON_CODE B ON A.NI_CLSF_CD = B.CD
+		WHERE  G.GOODS_CD = #{goodsCd}
+		AND    B.CD_GB = 'G004'
+		AND    B.USE_YN = 'Y'
+		GROUP  BY NI_CLSF_CD, B.CD_NM
+		ORDER  BY NI_CLSF_CD
+	</select>
+
+	<!-- 품목 목록 -->
+	<select id="getItemkindList" parameterType="Itemkind" resultType="CommonCode">
+		/* TsaRenderer.getItemkindList */
+		SELECT ITEMKIND_CD AS CD
+		     , ITEMKIND_NM AS CD_NM
+		FROM   TB_ITEMKIND
+		WHERE  USE_YN = 'Y'
+		<if test='itemkindCd != null and itemkindCd != ""'>
+		AND    ITEMKIND_CD = #{itemkindCd}
+		</if>
+		ORDER  BY ITEMKIND_CD
+	</select>
+
+	<!-- 브랜드그룹 목록 -->
+	<select id="getBrandGroupList" resultType="CommonCode">
+		/* TsaRenderer.getBrandGroupList */
+		SELECT BRAND_GRP_NM AS CD
+		     , BRAND_GRP_NM AS CD_NM
+		FROM   TB_BRAND
+		WHERE  USE_YN = 'Y'
+		AND    BRAND_GRP_NM IS NOT NULL
+		GROUP  BY BRAND_GRP_NM
+		ORDER  BY BRAND_GRP_NM
+	</select>
+
+	<!-- 컬러 목록 -->
+	<select id="getColorList" parameterType="Color" resultType="CommonCode">
+		/* TsaRenderer.getColorList */
+		SELECT COLOR_CD  AS CD
+		     , COLOR_ENM AS CD_NM
+		     , COLOR_KNM AS CD_DESC
+		     , USE_YN
+		FROM   TB_COLOR
+		WHERE  USE_YN = 'Y'
+		<if test='colorCd != null and colorCd != ""'>
+		AND    COLOR_CD = #{colorCd}
+		</if>
+		ORDER  BY COLOR_CD
+	</select>
+
+	<!-- 사용중 대카테고리 목록 -->
+	<select id="getTCategoryList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getTCategoryList */
+		SELECT TCATE_CD AS CD
+		     , TCATE_NM AS CD_NM
+		FROM   TB_CATEGORY_4SRCH
+		WHERE  1 = 1
+		<if test='cateGb != null and cateGb != ""'>
+		AND    CATE_GB = #{cateGb}
+		</if>
+		GROUP  BY TCATE_CD, TCATE_NM
+		ORDER  BY TCATE_CD
+	</select>
+
+	<!-- 브랜드에 등록된 MD 목록 -->
+	<select id="getBrandMdList" resultType="CommonCode">
+		/* TsaRenderer.getBrandMdList */
+		SELECT DISTINCT
+		       A.MD_NO   AS CD
+		     , C.USER_NM AS CD_NM
+		FROM   TB_BRAND_MD A
+		INNER JOIN TB_BRAND B ON A.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_USER C ON A.MD_NO = C.USER_NO
+		ORDER  BY C.USER_NM
+	</select>
+
+	<!-- 택배사명 목록 조회 -->
+	<select id="getShipCompanyList" resultType="CommonCode">
+		/* TsaDelivery.getShipCompanyList */
+		SELECT SHIP_COMP_CD  AS CD
+		     , SHIP_COMP_NM  AS CD_NM
+		FROM   TB_SHIP_COMPANY
+		WHERE  1 = 1
+		<if test='useYn != null and useYn != ""'>
+		AND    USE_YN = #{useYn}
+		</if>
+	</select>
+
+	<!-- MD별 브랜드 목록 조회 -->
+	<select id="getMdBrandList" resultType="CommonCode">
+		/* TsaRenderer.getMdBrandList*/
+		SELECT DISTINCT
+		       A.BRAND_CD AS CD
+		     , B.BRAND_ENM AS CD_NM
+		FROM   TB_BRAND_MD A
+		     , TB_BRAND B
+		WHERE  A.BRAND_CD = B.BRAND_CD
+		<if test='mdNo != null and mdNo != "" and mdNo != "all"'>
+		AND    A.MD_NO = #{mdNo}
+		</if>
+	</select>
+
+	<!-- MD별 브랜드그룹조회 -->
+	<select id="getMdBrandGrpList" resultType="CommonCode">
+		/* TsaRenderer.getMdBrandGrpList*/
+		SELECT DISTINCT
+		       B.BRAND_GRP_NM AS CD
+		     , B.BRAND_GRP_NM AS CD_NM
+		FROM   TB_BRAND_MD A
+		      ,TB_BRAND B
+		WHERE  A.BRAND_CD = B.BRAND_CD
+		<if test='mdNo != null and mdNo != "" and mdNo != "all"'>
+		AND    A.MD_NO = #{mdNo}
+		</if>
+		GROUP  BY BRAND_GRP_NM
+	</select>
+
+	<select id="getInstaAccount" resultType="CommonCode">
+		/* TsaRenderer.getInstaAccount*/
+		SELECT DISTINCT
+		       IT.INSTA_ACCOUNT AS CD
+		     , IT.INSTA_ACCOUNT AS CD_NM
+		FROM   TB_INSTAGRAM_TOKEN IT
+	</select>
+
+	<!-- 판매몰조회 -->
+	<select id="getSellStoreList" resultType="CommonCode">
+		/* TsaRenderer.getSellStoreList*/
+		SELECT DISTINCT
+		       SELL_STORE_CD AS CD
+		     , SELL_STORE_NM AS CD_NM
+		FROM   TB_SELL_STORE
+	</select>
+
+	<!-- 기본답변문구 제목 목록 -->
+	<select id="getBasicAnsTitleList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getBasicAnsTitleList */
+		SELECT ANS_SQ     AS CD
+		     , ANS_TITLE  AS CD_NM
+		FROM   TB_BASIC_ANS
+		WHERE  ANS_CLSF = #{ansClsf}
+		AND    USE_YN = 'Y'
+	</select>
+
+	<!-- 제휴링크 목록 -->
+	<select id="getAflinkList" parameterType="String" resultType="CommonCode">
+		/* TsaRenderer.getAflinkList */
+		SELECT AF_LINK_CD AS CD
+		     , AF_LINK_NM AS CD_NM
+		FROM   TB_AF_LINK
+		WHERE  AF_CHANNEL = #{afChannel}
+		AND    USE_YN = 'Y'
+	</select>
+	
+	<!-- 색상그룹코드 RGB 목록 -->
+	<select id="getColorGrpCdRgbList" resultType="CommonCode">
+		/* TsaRenderer.getColorGrpCdRgbList */
+		SELECT CD
+			 , CD_DESC AS CD_NM
+		FROM TB_COMMON_CODE
+		WHERE 1=1
+		AND CD_GB = 'G072'
+		AND USE_YN = 'Y'
+	</select>
+
 </mapper>

+ 622 - 622
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaSystem.xml

@@ -1,623 +1,623 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.style24.admin.biz.dao.TsaSystemDao">
-
-	<!-- 사용자 목록 -->
-	<select id="getUserList" parameterType="User" resultType="User">
-		/* TsaSystem.getUserList */
-		SELECT A.USER_NO                                                     /*사용자번호*/
-		     , A.USER_ID                                                     /*사용자ID*/
-		     , A.USER_NM                                                     /*사용자명*/
-		     , A.ROLE_CD                                                     /*권한코드*/
-		     , A.ROLE_REF_VAL                                                /*권한관련값*/
-		     , CASE WHEN SUBSTRING(A.ROLE_CD,1,1) IN ('A','B','E') THEN
-		                A.ROLE_REF_VAL
-		            END                                    AS SUPPLY_COMP_CD /*공급업체코드*/
-		     , CASE WHEN SUBSTRING(A.ROLE_CD,1,1) IN ('A','B','E') THEN
-		                (SELECT SUPPLY_COMP_NM
-		                 FROM   TB_SUPPLY_COMPANY
-		                 WHERE  SUPPLY_COMP_CD = A.ROLE_REF_VAL
-		                )
-		       END                                         AS SUPPLY_COMP_NM /*공급업체명*/
-		     , CASE WHEN SUBSTRING(A.ROLE_CD,1,1) = 'C' THEN
-		                A.ROLE_REF_VAL
-		       END                                         AS VENDOR_ID      /*벤더ID*/
-		     , CASE WHEN SUBSTRING(A.ROLE_CD,1,1) = 'C' THEN
-		                FN_GET_CODE_NM('G003',A.ROLE_REF_VAL)
-		       END                                         AS VENDOR_NM      /*벤더명*/
-		     , A.EMAIL                                                       /*이메일*/
-		     , A.CELL_PHNNO                                                  /*휴대전화번호*/
-		     , A.PNT_ASSIGN_AMT                                              /*포인트부여가능금액*/
-		     , A.IP_ADDR                                                     /*IP주소*/
-		     , A.IP_CHK_YN                                                   /*IP체크여부*/
-		     , DATE_FORMAT(A.LOGIN_LDT,'%Y%m%d%H%i%S')     AS LOGIN_LDT      /*최종로그인일시*/
-		     , DATE_FORMAT(A.PASSWD_CHG_DT,'%Y%m%d%H%i%S') AS PASSWD_CHG_DT  /*비밀번호변경일시*/
-		     , A.USE_YN                                                      /*사용여부*/
-		FROM   TB_USER A
-		WHERE  1 = 1
-		<choose>
-		    <when test="searchGb == 'userId'">
-		AND    LOWER(A.USER_ID) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
-		    </when>
-		    <when test="searchGb == 'userNm'">
-		AND    LOWER(A.USER_NM) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
-		    </when>
-		</choose>
-		<if test="useYn != null and useYn != ''">
-		AND    A.USE_YN  = #{useYn}
-		</if>
-		<if test="supplyCompCd != null and supplyCompCd != ''">
-		AND    A.ROLE_REF_VAL = #{supplyCompCd}
-		</if>
-		<if test="roleCd != null and roleCd != ''">
-		AND    A.ROLE_CD  = #{roleCd}
-		</if>
-		ORDER  BY A.USER_NM
-	</select>
-
-	<!-- 사용자 조회 -->
-	<select id="getUser" parameterType="Integer" resultType="User">
-		/* TsaSystem.getUser */
-		SELECT USER_NO                                                         /*사용자번호*/
-		     , USER_ID                                                         /*사용자ID*/
-		     , USER_NM                                                         /*사용자명*/
-		     , ROLE_CD                                                         /*권한코드*/
-		     , (SELECT CD_NM
-		        FROM   TB_COMMON_CODE
-		        WHERE  CD_GB = 'G001'
-		        AND    CD = A.ROLE_CD
-		       )                                              AS ROLE_NM       /*권한명*/
-		     , ROLE_REF_VAL                                                    /*권한관련값*/
-		     , EMAIL                                                           /*이메일*/
-		     , CELL_PHNNO                                                      /*휴대전화번호*/
-		     , PNT_ASSIGN_AMT                                                  /*포인트부여가능금액*/
-		     , IP_ADDR                                                         /*IP주소*/
-		     , IP_CHK_YN                                                       /*IP체크여부*/
-		     , DATE_FORMAT(LOGIN_LDT,'%Y-%m-%d %H:%i:%S')     AS LOGIN_LDT     /*최종로그인일시*/
-		     , DATE_FORMAT(PASSWD_CHG_DT,'%Y-%m-%d %H:%i:%S') AS PASSWD_CHG_DT /*비밀번호변경일시*/
-		     , USE_YN                                                          /*사용여부*/
-		FROM   TB_USER A
-		WHERE  USER_NO = #{userNo}
-	</select>
-
-	<!-- 사용자 삭제 -->
-	<update id="deleteUser" parameterType="User">
-		/* TsaSystem.deleteUser */
-		UPDATE TB_USER
-		SET    USE_YN = 'N'
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  USER_NO = #{userNo}
-	</update>
-
-	<!-- 사용자ID 건수 -->
-	<select id="getUserIdCount" parameterType="String" resultType="int">
-		/* TsaSystem.getUserIdCount */
-		SELECT COUNT(*) AS CNT
-		FROM   TB_USER
-		WHERE  USER_ID = #{userId}
-	</select>
-
-	<!-- 사용자 등록/수정 -->
-	<insert id="saveUser" parameterType="User" keyProperty="userNo">
-		/* TsaSystem.saveUser */
-		INSERT INTO TB_USER (
-		       USER_NO
-		     , USER_ID
-		     , USER_NM
-		     , PASSWD
-		     , ROLE_CD
-		     , ROLE_REF_VAL
-		     , EMAIL
-		     , CELL_PHNNO
-		     , PNT_ASSIGN_AMT
-		     , IP_ADDR
-		     , IP_CHK_YN
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{userNo}
-		     , #{userId}
-		     , #{userNm}
-		     , #{passwd}
-		     , #{roleCd}
-		     , #{roleRefVal}
-		     , #{email}
-		     , #{cellPhnno}
-		     , IFNULL(#{pntAssignAmt},0)
-		     , #{ipAddr}
-		     , #{ipChkYn}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       USER_NM = #{userNm}
-		     , ROLE_CD = #{roleCd}
-		     , ROLE_REF_VAL = #{roleRefVal}
-		     , EMAIL = #{email}
-		     , CELL_PHNNO = #{cellPhnno}
-		     , PNT_ASSIGN_AMT = IFNULL(#{pntAssignAmt},0)
-		     , IP_ADDR = #{ipAddr}
-		     , IP_CHK_YN = #{ipChkYn}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-
-	<!-- 임시비밀번호 조회 -->
-	<select id="getTemporaryPassword" parameterType="int" resultType="String">
-		/* TsaSystem.getTemporaryPassword */
-		SELECT CONVERT(TRUNCATE(A.VAL * CAST(CONCAT(1,LPAD(0,(#{length} - 1),'0')) AS UNSIGNED),0),CHAR) AS PASSWD FROM DUAL
-	</select>
-
-	<!-- 사용자 비밀번호 수정 -->
-	<update id="updateUserPassword" parameterType="User">
-		/* TsaSystem.updateUserPassword */
-		UPDATE TB_USER
-		SET    PASSWD = #{passwd}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  USER_NO = #{userNo}
-	</update>
-
-	<!-- 사용자 메뉴 목록 -->
-	<select id="getUserMenuList" parameterType="Integer" resultType="UserMenu">
-		/* TsaSystem.getUserMenuList */
-		WITH RECURSIVE CONNECTBY AS (
-		    SELECT 1                                    AS LVL
-		         , PMENU_ID
-		         , MENU_ID
-		         , MENU_NM
-		         , MENU_GB
-		         , CONCAT(MENU_ID,LPAD(DISP_ORD,4,'0')) AS ORDBY
-		    FROM   TB_MENU
-		    WHERE  PMENU_ID = 'ROOT'
-		    AND    USE_YN = 'Y'
-		    
-		    UNION ALL
-		    
-		    SELECT A.LVL + 1                              AS LVL
-		         , B.PMENU_ID
-		         , B.MENU_ID
-		         , B.MENU_NM
-		         , B.MENU_GB
-		         , CONCAT(A.ORDBY,LPAD(B.DISP_ORD,4,'0')) AS ORDBY
-		    FROM   CONNECTBY A
-		    INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
-		)
-		SELECT #{userNo}                       AS USER_NO  /*사용자번호*/
-		     , A.PMENU_ID                                  /*상위메뉴ID*/
-		     , A.MENU_ID                                   /*메뉴ID*/
-		     , A.MENU_NM                                   /*메뉴명*/
-		     , A.MENU_GB                                   /*메뉴구분*/
-		     , CASE WHEN B.USER_NO IS NULL OR B.USE_ROLE = 'NNNN' THEN
-		                'N'
-		            ELSE
-		                'Y'
-		       END                             AS USE_YN   /*사용여부*/
-		     , A.LVL                           AS MENU_LVL /*메뉴레벨*/
-		     , IFNULL(B.USE_ROLE,'NNNN')       AS USE_ROLE /*사용권한*/
-		FROM   CONNECTBY A
-		LEFT OUTER JOIN TB_USER_MENU B ON A.MENU_ID = B.MENU_ID
-		                              AND B.USER_NO = #{userNo}
-		ORDER  BY A.ORDBY
-	</select>
-	
-	<!-- 사용자정보변경이력 생성 -->
-	<insert id="createUserInfoChangeHistory" parameterType="UserHst">
-		/* TsaSystem.createUserInfoChangeHistory */
-		INSERT INTO TB_USER_HST (
-		       CHG_HST_SQ
-		     , USER_NO
-		     , CHG_GB
-		     , CHG_CONTENT
-		     , REG_NO
-		     , REG_DT
-		)
-		VALUES (
-		       NULL
-		     , #{userNo}
-		     , #{chgGb}
-		     , CASE WHEN #{chgGb} = 'G049_20' THEN
-		                CONCAT(FN_GET_CODE_NM('G001',#{orgRoleCd}),' -> ',FN_GET_CODE_NM('G001',#{roleCd}))
-		            ELSE
-		                NULL
-		       END
-		     , #{regNo}
-		     , NOW()
-		)
-	</insert>
-
-	<!-- 메뉴 목록 -->
-	<select id="getMenuList" parameterType="Menu" resultType="Menu">
-		/* TsaSystem.getMenuList */
-		WITH RECURSIVE CONNECTBY1 AS (
-		    SELECT 1                                    AS MENU_LVL  /*메뉴레벨*/
-		         , MENU_ID                                           /*메뉴ID*/
-		         , MENU_NM                                           /*메뉴명*/
-		         , MENU_GB                                           /*메뉴구분*/
-		         , MENU_DESC                                         /*메뉴상세명*/
-		         , MENU_URL                                          /*메뉴URL*/
-		         , PMENU_ID                                          /*상위메뉴ID*/
-		         , DISP_ORD                                          /*표시순서*/
-		         , USE_YN                                            /*사용여부*/
-		         , MENU_ID                              AS TREE_PATH /*AG-GRID트리패스(ag-Grid미사용시 필요 없음)*/
-		         , CONCAT(MENU_ID,LPAD(DISP_ORD,4,'0')) AS ORDBY
-		    FROM   TB_MENU A
-		    WHERE  1 = 1
-		    <choose>
-		        <when test="pmenuId != null and pmenuId != ''">
-		    AND    PMENU_ID = #{pmenuId}
-		        </when>
-		        <otherwise>
-		    AND    PMENU_ID = 'ROOT'
-		        </otherwise>
-		    </choose>
-		    
-		    UNION ALL
-		    
-		    SELECT A.MENU_LVL + 1                         AS MENU_LVL  /*메뉴레벨*/
-		         , B.MENU_ID                                           /*메뉴ID*/
-		         , B.MENU_NM                                           /*메뉴명*/
-		         , B.MENU_GB                                           /*메뉴구분*/
-		         , B.MENU_DESC                                         /*메뉴상세명*/
-		         , B.MENU_URL                                          /*메뉴URL*/
-		         , B.PMENU_ID                                          /*상위메뉴ID*/
-		         , B.DISP_ORD                                          /*표시순서*/
-		         , B.USE_YN                                            /*사용여부*/
-		         , CONCAT(A.TREE_PATH,'/',B.MENU_ID)      AS TREE_PATH /*AG-GRID트리패스(ag-Grid미사용시 필요 없음) */
-		         , CONCAT(A.ORDBY,LPAD(B.DISP_ORD,4,'0')) AS ORDBY
-		    FROM   CONNECTBY1 A
-		    INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
-		), TAB_MENU_ROLE AS (
-		    SELECT A.MENU_ID
-		         , GROUP_CONCAT(B.ROLE_CD ORDER BY B.ROLE_CD SEPARATOR ',')                        AS ROLE_CDS /*다중메뉴권한코드*/
-		         , GROUP_CONCAT(FN_GET_CODE_NM('G001',B.ROLE_CD) ORDER BY B.ROLE_CD SEPARATOR ',') AS ROLE_NMS /*다중메뉴권한명*/
-		    FROM   TB_MENU A
-		    INNER JOIN TB_MENU_ROLE B ON A.MENU_ID = B.MENU_ID
-		    GROUP  BY A.MENU_ID
-		)
-		SELECT MENU_LVL
-		     , MENU_ID
-		     , MENU_NM
-		     , MENU_GB
-		     , MENU_DESC
-		     , MENU_URL
-		     , PMENU_ID
-		     , DISP_ORD
-		     , USE_YN
-		     , TREE_PATH
-		     , (SELECT ROLE_CDS
-		        FROM   TAB_MENU_ROLE
-		        WHERE  MENU_ID = A.MENU_ID) AS ROLE_CDS  /*다중메뉴권한코드*/
-		     , (SELECT ROLE_NMS
-		        FROM   TAB_MENU_ROLE
-		        WHERE  MENU_ID = A.MENU_ID) AS ROLE_NMS  /*다중메뉴권한명*/
-		FROM   CONNECTBY1 A
-		ORDER  BY ORDBY
-	</select>
-
-	<!-- 메뉴 등록/수정 -->
-	<insert id="saveMenu" parameterType="Menu">
-		/* TsaSystem.saveMenu */
-		INSERT INTO TB_MENU (
-		       MENU_ID
-		     , MENU_NM
-		     , MENU_GB
-		     , MENU_DESC
-		     , MENU_URL
-		     , DISP_ORD
-		     , USE_YN
-		     , PMENU_ID
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{menuId}
-		     , #{menuNm}
-		     , #{menuGb}
-		     , #{menuDesc}
-		     , #{menuUrl}
-		     , #{dispOrd}
-		     , #{useYn}
-		     , IFNULL(NULLIF(#{pmenuId},''),'ROOT')
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       MENU_NM = #{menuNm}
-		     , MENU_GB = #{menuGb}
-		     , MENU_DESC = #{menuDesc}
-		     , MENU_URL = #{menuUrl}
-		     , DISP_ORD = #{dispOrd}
-		     , USE_YN = #{useYn}
-		     , PMENU_ID = IFNULL(NULLIF(#{pmenuId},''),'ROOT')
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-
-	<!-- 메뉴권한 삭제 -->
-	<delete id="deleteMenuRole" parameterType="String">
-		/* TsaSystem.deleteMenuRole */
-		DELETE FROM TB_MENU_ROLE
-		WHERE  MENU_ID = #{menuId}
-	</delete>
-
-	<!-- 메뉴권한 생성 -->
-	<insert id="createMenuRole" parameterType="MenuRole">
-		/* TsaSystem.createMenuRole */
-		INSERT INTO TB_MENU_ROLE (
-		       ROLE_CD
-		     , MENU_ID
-		     , USE_ROLE
-		     , REG_NO
-		     , REG_DT
-		)
-		VALUES (
-		       #{roleCd}
-		     , #{menuId}
-		     , IFNULL(NULLIF(#{useRole},''),'RCUD')
-		     , #{regNo}
-		     , NOW()
-		)
-	</insert>
-
-	<!-- 전체 사용자 메뉴 삭제 -->
-	<delete id="deleteAllUserMenu" parameterType="MenuRole">
-		/* TsaSystem.deleteAllUserMenu */
-		DELETE
-		FROM   TB_USER_MENU
-		WHERE  USER_NO IN (SELECT USER_NO
-		                   FROM   TB_USER
-		                   WHERE  ROLE_CD = #{roleCd}
-		                  )
-		AND    MENU_ID = #{menuId}
-	</delete>
-
-	<!-- 전체 사용자 메뉴 생성-->
-	<insert id="createAllUserMenu" parameterType="MenuRole">
-		/* TsaSystem.createAllUserMenu */
-		INSERT INTO TB_USER_MENU (
-		       USER_NO
-		     , MENU_ID
-		     , USE_ROLE
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		SELECT B.USER_NO
-		     , A.MENU_ID
-		     , A.USE_ROLE
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		FROM   TB_MENU_ROLE A
-		INNER JOIN TB_USER B ON A.ROLE_CD = B.ROLE_CD
-		WHERE  A.ROLE_CD = #{roleCd}
-		AND    A.MENU_ID = #{menuId}
-		AND    B.USE_YN = 'Y'
-		ON DUPLICATE KEY UPDATE
-		       USE_ROLE = A.USE_ROLE
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-
-	<!-- 사용자 전체 메뉴 삭제 -->
-	<delete id="deleteUserAllMenu" parameterType="Integer">
-		/* TsaSystem.deleteUserAllMenu */
-		DELETE
-		FROM   TB_USER_MENU
-		WHERE  USER_NO = #{userNo}
-	</delete>
-
-	<!-- 사용자 전체 메뉴 생성 -->
-	<insert id="createUserAllMenu" parameterType="User">
-		/* TsaSystem.createUserAllMenu */
-		INSERT INTO TB_USER_MENU (
-		       USER_NO
-		     , MENU_ID
-		     , USE_ROLE
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		SELECT A.USER_NO
-		     , B.MENU_ID
-		     , B.USE_ROLE
-		     , #{regNo}     AS REG_NO
-		     , NOW()        AS REG_DT
-		     , #{updNo}     AS UPD_NO
-		     , NOW()        AS UPD_DT
-		FROM   TB_USER A
-		INNER JOIN TB_MENU_ROLE B ON A.ROLE_CD = B.ROLE_CD
-		WHERE  A.USER_NO = #{userNo}
-		AND    A.ROLE_CD = #{roleCd}
-	</insert>
-
-	<!-- 사용자 메뉴 삭제 -->
-	<delete id="deleteUserMenu" parameterType="UserMenu">
-		/* TsaSystem.deleteUserMenu */
-		DELETE
-		FROM   TB_USER_MENU
-		WHERE  USER_NO = #{userNo}
-		AND    MENU_ID = #{menuId}
-	</delete>
-
-	<!-- 사용자 메뉴 Insert/Update -->
-	<insert id="createUserMenu" parameterType="UserMenu">
-		/* TsaSystem.createUserMenu */
-		INSERT INTO TB_USER_MENU (
-		       USER_NO
-		     , MENU_ID
-		     , USE_ROLE
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{userNo}
-		     , #{menuId}
-		     , #{useRole}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       USE_ROLE = #{useRole}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-	
-	<!-- 메뉴접속이력 생성 -->
-	<insert id="createMenuAccessHistory" parameterType="MenuAccessHst">
-		/* TsaSystem.createMenuAccessHistory */
-		INSERT INTO TB_MENU_ACCESS_HST (
-		       MENU_ACCESS_SQ
-		     , USER_NO
-		     , MENU_ID
-		     , REQ_URL
-		     , PARAMS
-		     , REG_NO
-		     , REG_DT
-		)
-		VALUES (
-		       NULL
-		     , #{userNo}
-		     , #{menuId}
-		     , #{reqUrl}
-		     , #{params}
-		     , #{userNo}
-		     , NOW()
-		)
-	</insert>
-
-	<!-- 공통코드 목록 -->
-	<select id="getCommonCodeList" parameterType="CommonCode" resultType="CommonCode">
-		/* TsaSystem.getCommonCodeList */
-		SELECT CD_GB
-		     , CD
-		     , CD_NM
-		     , CD_DESC
-		     , DISP_ORD
-		     , USE_YN
-		     , DISP_ORD
-		FROM   TB_COMMON_CODE
-		WHERE  CD_GB = #{cdGb}
-		ORDER  BY DISP_ORD
-	</select>
-
-	<!-- 공통코드 등록/수정 -->
-	<insert id="saveCommonCode" parameterType="CommonCode">
-		/* TsaSystem.saveCommonCode */
-		INSERT INTO TB_COMMON_CODE (
-		       CD_GB
-		     , CD
-		     , CD_NM
-		     , CD_DESC
-		     , DISP_ORD
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       #{cdGb}
-		     , #{cd}
-		     , #{cdNm}
-		     , #{cdDesc}
-		     , #{dispOrd}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-		ON DUPLICATE KEY UPDATE
-		       CD_NM = #{cdNm}
-		     , CD_DESC = #{cdDesc}
-		     , DISP_ORD = #{dispOrd}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-	</insert>
-
-	<!-- 공통코드 삭제 -->
-	<delete id="deleteCommonCode" parameterType="CommonCode">
-		/* TsaSystem.deleteCode */
-		DELETE FROM TB_COMMON_CODE
-		WHERE  CD_GB = #{cdGb}
-		AND    CD = #{cd}
-	</delete>
-	
-	<!-- 샘플파일 목록 -->
-	<select id="getSampleFileList" resultType="SampleFile">
-		/* TsaSystem.getSampleFileList */
-		SELECT SAMPLE_FILE_ID
-		     , SAMPLE_FILE_NM
-		     , ORG_FILE_NM
-		     , SYS_FILE_NM
-		     , USE_YN
-		FROM   TB_SAMPLE_FILE
-		ORDER  BY SAMPLE_FILE_NM
-	</select>
-
-	<!-- 샘플파일 등록/수정 -->
-	<insert id="createSampleFile" parameterType="SampleFile">
-		/* TsaSystem.createSampleFile */
-		INSERT INTO TB_SAMPLE_FILE (
-		       SAMPLE_FILE_ID
-		     , SAMPLE_FILE_NM
-		     , ORG_FILE_NM
-		     , SYS_FILE_NM
-		     , USE_YN
-		     , REG_NO
-		     , REG_DT
-		     , UPD_NO
-		     , UPD_DT
-		)
-		VALUES (
-		       (SELECT CONCAT('SF',IFNULL(LPAD(CAST(SUBSTRING(MAX(SAMPLE_FILE_ID),3) AS UNSIGNED) + 1,3,'0'),'000'))
-		        FROM   TB_SAMPLE_FILE Z
-		       )
-		     , #{sampleFileNm}
-		     , #{orgFileNm}
-		     , #{sysFileNm}
-		     , #{useYn}
-		     , #{regNo}
-		     , NOW()
-		     , #{updNo}
-		     , NOW()
-		)
-	</insert>
-	
-	<!-- 샘플파일 등록/수정 -->
-	<update id="updateSampleFile" parameterType="SampleFile">
-		/* TsaSystem.updateSampleFile */
-		UPDATE TB_SAMPLE_FILE
-		SET    SAMPLE_FILE_NM = #{sampleFileNm}
-		     , ORG_FILE_NM = #{orgFileNm}
-		     , SYS_FILE_NM = #{sysFileNm}
-		     , USE_YN = #{useYn}
-		     , UPD_NO = #{updNo}
-		     , UPD_DT = NOW()
-		WHERE  SAMPLE_FILE_ID = #{sampleFileId}
-	</update>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaSystemDao">
+
+	<!-- 사용자 목록 -->
+	<select id="getUserList" parameterType="User" resultType="User">
+		/* TsaSystem.getUserList */
+		SELECT A.USER_NO                                                     /*사용자번호*/
+		     , A.USER_ID                                                     /*사용자ID*/
+		     , A.USER_NM                                                     /*사용자명*/
+		     , A.ROLE_CD                                                     /*권한코드*/
+		     , A.ROLE_REF_VAL                                                /*권한관련값*/
+		     , CASE WHEN SUBSTRING(A.ROLE_CD,1,1) IN ('A','B','E') THEN
+		                A.ROLE_REF_VAL
+		            END                                    AS SUPPLY_COMP_CD /*공급업체코드*/
+		     , CASE WHEN SUBSTRING(A.ROLE_CD,1,1) IN ('A','B','E') THEN
+		                (SELECT SUPPLY_COMP_NM
+		                 FROM   TB_SUPPLY_COMPANY
+		                 WHERE  SUPPLY_COMP_CD = A.ROLE_REF_VAL
+		                )
+		       END                                         AS SUPPLY_COMP_NM /*공급업체명*/
+		     , CASE WHEN SUBSTRING(A.ROLE_CD,1,1) = 'C' THEN
+		                A.ROLE_REF_VAL
+		       END                                         AS VENDOR_ID      /*벤더ID*/
+		     , CASE WHEN SUBSTRING(A.ROLE_CD,1,1) = 'C' THEN
+		                FN_GET_CODE_NM('G003',A.ROLE_REF_VAL)
+		       END                                         AS VENDOR_NM      /*벤더명*/
+		     , A.EMAIL                                                       /*이메일*/
+		     , A.CELL_PHNNO                                                  /*휴대전화번호*/
+		     , A.PNT_ASSIGN_AMT                                              /*포인트부여가능금액*/
+		     , A.IP_ADDR                                                     /*IP주소*/
+		     , A.IP_CHK_YN                                                   /*IP체크여부*/
+		     , DATE_FORMAT(A.LOGIN_LDT,'%Y%m%d%H%i%S')     AS LOGIN_LDT      /*최종로그인일시*/
+		     , DATE_FORMAT(A.PASSWD_CHG_DT,'%Y%m%d%H%i%S') AS PASSWD_CHG_DT  /*비밀번호변경일시*/
+		     , A.USE_YN                                                      /*사용여부*/
+		FROM   TB_USER A
+		WHERE  1 = 1
+		<choose>
+		    <when test="searchGb == 'userId'">
+		AND    LOWER(A.USER_ID) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </when>
+		    <when test="searchGb == 'userNm'">
+		AND    LOWER(A.USER_NM) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </when>
+		</choose>
+		<if test="useYn != null and useYn != ''">
+		AND    A.USE_YN  = #{useYn}
+		</if>
+		<if test="supplyCompCd != null and supplyCompCd != ''">
+		AND    A.ROLE_REF_VAL = #{supplyCompCd}
+		</if>
+		<if test="roleCd != null and roleCd != ''">
+		AND    A.ROLE_CD  = #{roleCd}
+		</if>
+		ORDER  BY A.USER_NM
+	</select>
+
+	<!-- 사용자 조회 -->
+	<select id="getUser" parameterType="Integer" resultType="User">
+		/* TsaSystem.getUser */
+		SELECT USER_NO                                                         /*사용자번호*/
+		     , USER_ID                                                         /*사용자ID*/
+		     , USER_NM                                                         /*사용자명*/
+		     , ROLE_CD                                                         /*권한코드*/
+		     , (SELECT CD_NM
+		        FROM   TB_COMMON_CODE
+		        WHERE  CD_GB = 'G001'
+		        AND    CD = A.ROLE_CD
+		       )                                              AS ROLE_NM       /*권한명*/
+		     , ROLE_REF_VAL                                                    /*권한관련값*/
+		     , EMAIL                                                           /*이메일*/
+		     , CELL_PHNNO                                                      /*휴대전화번호*/
+		     , PNT_ASSIGN_AMT                                                  /*포인트부여가능금액*/
+		     , IP_ADDR                                                         /*IP주소*/
+		     , IP_CHK_YN                                                       /*IP체크여부*/
+		     , DATE_FORMAT(LOGIN_LDT,'%Y-%m-%d %H:%i:%S')     AS LOGIN_LDT     /*최종로그인일시*/
+		     , DATE_FORMAT(PASSWD_CHG_DT,'%Y-%m-%d %H:%i:%S') AS PASSWD_CHG_DT /*비밀번호변경일시*/
+		     , USE_YN                                                          /*사용여부*/
+		FROM   TB_USER A
+		WHERE  USER_NO = #{userNo}
+	</select>
+
+	<!-- 사용자 삭제 -->
+	<update id="deleteUser" parameterType="User">
+		/* TsaSystem.deleteUser */
+		UPDATE TB_USER
+		SET    USE_YN = 'N'
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  USER_NO = #{userNo}
+	</update>
+
+	<!-- 사용자ID 건수 -->
+	<select id="getUserIdCount" parameterType="String" resultType="int">
+		/* TsaSystem.getUserIdCount */
+		SELECT COUNT(*) AS CNT
+		FROM   TB_USER
+		WHERE  USER_ID = #{userId}
+	</select>
+
+	<!-- 사용자 등록/수정 -->
+	<insert id="saveUser" parameterType="User" keyProperty="userNo">
+		/* TsaSystem.saveUser */
+		INSERT INTO TB_USER (
+		       USER_NO
+		     , USER_ID
+		     , USER_NM
+		     , PASSWD
+		     , ROLE_CD
+		     , ROLE_REF_VAL
+		     , EMAIL
+		     , CELL_PHNNO
+		     , PNT_ASSIGN_AMT
+		     , IP_ADDR
+		     , IP_CHK_YN
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{userNo}
+		     , #{userId}
+		     , #{userNm}
+		     , #{passwd}
+		     , #{roleCd}
+		     , #{roleRefVal}
+		     , #{email}
+		     , #{cellPhnno}
+		     , IFNULL(#{pntAssignAmt},0)
+		     , #{ipAddr}
+		     , #{ipChkYn}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       USER_NM = #{userNm}
+		     , ROLE_CD = #{roleCd}
+		     , ROLE_REF_VAL = #{roleRefVal}
+		     , EMAIL = #{email}
+		     , CELL_PHNNO = #{cellPhnno}
+		     , PNT_ASSIGN_AMT = IFNULL(#{pntAssignAmt},0)
+		     , IP_ADDR = #{ipAddr}
+		     , IP_CHK_YN = #{ipChkYn}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+
+	<!-- 임시비밀번호 조회 -->
+	<select id="getTemporaryPassword" parameterType="int" resultType="String">
+		/* TsaSystem.getTemporaryPassword */
+		SELECT CONVERT(TRUNCATE(A.VAL * CAST(CONCAT(1,LPAD(0,(#{length} - 1),'0')) AS UNSIGNED),0),CHAR) AS PASSWD FROM DUAL
+	</select>
+
+	<!-- 사용자 비밀번호 수정 -->
+	<update id="updateUserPassword" parameterType="User">
+		/* TsaSystem.updateUserPassword */
+		UPDATE TB_USER
+		SET    PASSWD = #{passwd}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  USER_NO = #{userNo}
+	</update>
+
+	<!-- 사용자 메뉴 목록 -->
+	<select id="getUserMenuList" parameterType="Integer" resultType="UserMenu">
+		/* TsaSystem.getUserMenuList */
+		WITH RECURSIVE CONNECTBY AS (
+		    SELECT 1                                    AS LVL
+		         , PMENU_ID
+		         , MENU_ID
+		         , MENU_NM
+		         , MENU_GB
+		         , CONCAT(MENU_ID,LPAD(DISP_ORD,4,'0')) AS ORDBY
+		    FROM   TB_MENU
+		    WHERE  PMENU_ID = 'ROOT'
+		    AND    USE_YN = 'Y'
+		    
+		    UNION ALL
+		    
+		    SELECT A.LVL + 1                              AS LVL
+		         , B.PMENU_ID
+		         , B.MENU_ID
+		         , B.MENU_NM
+		         , B.MENU_GB
+		         , CONCAT(A.ORDBY,LPAD(B.DISP_ORD,4,'0')) AS ORDBY
+		    FROM   CONNECTBY A
+		    INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
+		)
+		SELECT #{userNo}                       AS USER_NO  /*사용자번호*/
+		     , A.PMENU_ID                                  /*상위메뉴ID*/
+		     , A.MENU_ID                                   /*메뉴ID*/
+		     , A.MENU_NM                                   /*메뉴명*/
+		     , A.MENU_GB                                   /*메뉴구분*/
+		     , CASE WHEN B.USER_NO IS NULL OR B.USE_ROLE = 'NNNN' THEN
+		                'N'
+		            ELSE
+		                'Y'
+		       END                             AS USE_YN   /*사용여부*/
+		     , A.LVL                           AS MENU_LVL /*메뉴레벨*/
+		     , IFNULL(B.USE_ROLE,'NNNN')       AS USE_ROLE /*사용권한*/
+		FROM   CONNECTBY A
+		LEFT OUTER JOIN TB_USER_MENU B ON A.MENU_ID = B.MENU_ID
+		                              AND B.USER_NO = #{userNo}
+		ORDER  BY A.ORDBY
+	</select>
+	
+	<!-- 사용자정보변경이력 생성 -->
+	<insert id="createUserInfoChangeHistory" parameterType="UserHst">
+		/* TsaSystem.createUserInfoChangeHistory */
+		INSERT INTO TB_USER_HST (
+		       CHG_HST_SQ
+		     , USER_NO
+		     , CHG_GB
+		     , CHG_CONTENT
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       NULL
+		     , #{userNo}
+		     , #{chgGb}
+		     , CASE WHEN #{chgGb} = 'G049_20' THEN
+		                CONCAT(FN_GET_CODE_NM('G001',#{orgRoleCd}),' -> ',FN_GET_CODE_NM('G001',#{roleCd}))
+		            ELSE
+		                NULL
+		       END
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 메뉴 목록 -->
+	<select id="getMenuList" parameterType="Menu" resultType="Menu">
+		/* TsaSystem.getMenuList */
+		WITH RECURSIVE CONNECTBY1 AS (
+		    SELECT 1                                    AS MENU_LVL  /*메뉴레벨*/
+		         , MENU_ID                                           /*메뉴ID*/
+		         , MENU_NM                                           /*메뉴명*/
+		         , MENU_GB                                           /*메뉴구분*/
+		         , MENU_DESC                                         /*메뉴상세명*/
+		         , MENU_URL                                          /*메뉴URL*/
+		         , PMENU_ID                                          /*상위메뉴ID*/
+		         , DISP_ORD                                          /*표시순서*/
+		         , USE_YN                                            /*사용여부*/
+		         , MENU_ID                              AS TREE_PATH /*AG-GRID트리패스(ag-Grid미사용시 필요 없음)*/
+		         , CONCAT(MENU_ID,LPAD(DISP_ORD,4,'0')) AS ORDBY
+		    FROM   TB_MENU A
+		    WHERE  1 = 1
+		    <choose>
+		        <when test="pmenuId != null and pmenuId != ''">
+		    AND    PMENU_ID = #{pmenuId}
+		        </when>
+		        <otherwise>
+		    AND    PMENU_ID = 'ROOT'
+		        </otherwise>
+		    </choose>
+		    
+		    UNION ALL
+		    
+		    SELECT A.MENU_LVL + 1                         AS MENU_LVL  /*메뉴레벨*/
+		         , B.MENU_ID                                           /*메뉴ID*/
+		         , B.MENU_NM                                           /*메뉴명*/
+		         , B.MENU_GB                                           /*메뉴구분*/
+		         , B.MENU_DESC                                         /*메뉴상세명*/
+		         , B.MENU_URL                                          /*메뉴URL*/
+		         , B.PMENU_ID                                          /*상위메뉴ID*/
+		         , B.DISP_ORD                                          /*표시순서*/
+		         , B.USE_YN                                            /*사용여부*/
+		         , CONCAT(A.TREE_PATH,'/',B.MENU_ID)      AS TREE_PATH /*AG-GRID트리패스(ag-Grid미사용시 필요 없음) */
+		         , CONCAT(A.ORDBY,LPAD(B.DISP_ORD,4,'0')) AS ORDBY
+		    FROM   CONNECTBY1 A
+		    INNER JOIN TB_MENU B ON A.MENU_ID = B.PMENU_ID
+		), TAB_MENU_ROLE AS (
+		    SELECT A.MENU_ID
+		         , GROUP_CONCAT(B.ROLE_CD ORDER BY B.ROLE_CD SEPARATOR ',')                        AS ROLE_CDS /*다중메뉴권한코드*/
+		         , GROUP_CONCAT(FN_GET_CODE_NM('G001',B.ROLE_CD) ORDER BY B.ROLE_CD SEPARATOR ',') AS ROLE_NMS /*다중메뉴권한명*/
+		    FROM   TB_MENU A
+		    INNER JOIN TB_MENU_ROLE B ON A.MENU_ID = B.MENU_ID
+		    GROUP  BY A.MENU_ID
+		)
+		SELECT MENU_LVL
+		     , MENU_ID
+		     , MENU_NM
+		     , MENU_GB
+		     , MENU_DESC
+		     , MENU_URL
+		     , PMENU_ID
+		     , DISP_ORD
+		     , USE_YN
+		     , TREE_PATH
+		     , (SELECT ROLE_CDS
+		        FROM   TAB_MENU_ROLE
+		        WHERE  MENU_ID = A.MENU_ID) AS ROLE_CDS  /*다중메뉴권한코드*/
+		     , (SELECT ROLE_NMS
+		        FROM   TAB_MENU_ROLE
+		        WHERE  MENU_ID = A.MENU_ID) AS ROLE_NMS  /*다중메뉴권한명*/
+		FROM   CONNECTBY1 A
+		ORDER  BY ORDBY
+	</select>
+
+	<!-- 메뉴 등록/수정 -->
+	<insert id="saveMenu" parameterType="Menu">
+		/* TsaSystem.saveMenu */
+		INSERT INTO TB_MENU (
+		       MENU_ID
+		     , MENU_NM
+		     , MENU_GB
+		     , MENU_DESC
+		     , MENU_URL
+		     , DISP_ORD
+		     , USE_YN
+		     , PMENU_ID
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{menuId}
+		     , #{menuNm}
+		     , #{menuGb}
+		     , #{menuDesc}
+		     , #{menuUrl}
+		     , #{dispOrd}
+		     , #{useYn}
+		     , IFNULL(NULLIF(#{pmenuId},''),'ROOT')
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       MENU_NM = #{menuNm}
+		     , MENU_GB = #{menuGb}
+		     , MENU_DESC = #{menuDesc}
+		     , MENU_URL = #{menuUrl}
+		     , DISP_ORD = #{dispOrd}
+		     , USE_YN = #{useYn}
+		     , PMENU_ID = IFNULL(NULLIF(#{pmenuId},''),'ROOT')
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+
+	<!-- 메뉴권한 삭제 -->
+	<delete id="deleteMenuRole" parameterType="String">
+		/* TsaSystem.deleteMenuRole */
+		DELETE FROM TB_MENU_ROLE
+		WHERE  MENU_ID = #{menuId}
+	</delete>
+
+	<!-- 메뉴권한 생성 -->
+	<insert id="createMenuRole" parameterType="MenuRole">
+		/* TsaSystem.createMenuRole */
+		INSERT INTO TB_MENU_ROLE (
+		       ROLE_CD
+		     , MENU_ID
+		     , USE_ROLE
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       #{roleCd}
+		     , #{menuId}
+		     , IFNULL(NULLIF(#{useRole},''),'RCUD')
+		     , #{regNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 전체 사용자 메뉴 삭제 -->
+	<delete id="deleteAllUserMenu" parameterType="MenuRole">
+		/* TsaSystem.deleteAllUserMenu */
+		DELETE
+		FROM   TB_USER_MENU
+		WHERE  USER_NO IN (SELECT USER_NO
+		                   FROM   TB_USER
+		                   WHERE  ROLE_CD = #{roleCd}
+		                  )
+		AND    MENU_ID = #{menuId}
+	</delete>
+
+	<!-- 전체 사용자 메뉴 생성-->
+	<insert id="createAllUserMenu" parameterType="MenuRole">
+		/* TsaSystem.createAllUserMenu */
+		INSERT INTO TB_USER_MENU (
+		       USER_NO
+		     , MENU_ID
+		     , USE_ROLE
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT B.USER_NO
+		     , A.MENU_ID
+		     , A.USE_ROLE
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		FROM   TB_MENU_ROLE A
+		INNER JOIN TB_USER B ON A.ROLE_CD = B.ROLE_CD
+		WHERE  A.ROLE_CD = #{roleCd}
+		AND    A.MENU_ID = #{menuId}
+		AND    B.USE_YN = 'Y'
+		ON DUPLICATE KEY UPDATE
+		       USE_ROLE = A.USE_ROLE
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+
+	<!-- 사용자 전체 메뉴 삭제 -->
+	<delete id="deleteUserAllMenu" parameterType="Integer">
+		/* TsaSystem.deleteUserAllMenu */
+		DELETE
+		FROM   TB_USER_MENU
+		WHERE  USER_NO = #{userNo}
+	</delete>
+
+	<!-- 사용자 전체 메뉴 생성 -->
+	<insert id="createUserAllMenu" parameterType="User">
+		/* TsaSystem.createUserAllMenu */
+		INSERT INTO TB_USER_MENU (
+		       USER_NO
+		     , MENU_ID
+		     , USE_ROLE
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		SELECT A.USER_NO
+		     , B.MENU_ID
+		     , B.USE_ROLE
+		     , #{regNo}     AS REG_NO
+		     , NOW()        AS REG_DT
+		     , #{updNo}     AS UPD_NO
+		     , NOW()        AS UPD_DT
+		FROM   TB_USER A
+		INNER JOIN TB_MENU_ROLE B ON A.ROLE_CD = B.ROLE_CD
+		WHERE  A.USER_NO = #{userNo}
+		AND    A.ROLE_CD = #{roleCd}
+	</insert>
+
+	<!-- 사용자 메뉴 삭제 -->
+	<delete id="deleteUserMenu" parameterType="UserMenu">
+		/* TsaSystem.deleteUserMenu */
+		DELETE
+		FROM   TB_USER_MENU
+		WHERE  USER_NO = #{userNo}
+		AND    MENU_ID = #{menuId}
+	</delete>
+
+	<!-- 사용자 메뉴 Insert/Update -->
+	<insert id="createUserMenu" parameterType="UserMenu">
+		/* TsaSystem.createUserMenu */
+		INSERT INTO TB_USER_MENU (
+		       USER_NO
+		     , MENU_ID
+		     , USE_ROLE
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{userNo}
+		     , #{menuId}
+		     , #{useRole}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       USE_ROLE = #{useRole}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+	
+	<!-- 메뉴접속이력 생성 -->
+	<insert id="createMenuAccessHistory" parameterType="MenuAccessHst">
+		/* TsaSystem.createMenuAccessHistory */
+		INSERT INTO TB_MENU_ACCESS_HST (
+		       MENU_ACCESS_SQ
+		     , USER_NO
+		     , MENU_ID
+		     , REQ_URL
+		     , PARAMS
+		     , REG_NO
+		     , REG_DT
+		)
+		VALUES (
+		       NULL
+		     , #{userNo}
+		     , #{menuId}
+		     , #{reqUrl}
+		     , #{params}
+		     , #{userNo}
+		     , NOW()
+		)
+	</insert>
+
+	<!-- 공통코드 목록 -->
+	<select id="getCommonCodeList" parameterType="CommonCode" resultType="CommonCode">
+		/* TsaSystem.getCommonCodeList */
+		SELECT CD_GB
+		     , CD
+		     , CD_NM
+		     , CD_DESC
+		     , DISP_ORD
+		     , USE_YN
+		     , DISP_ORD
+		FROM   TB_COMMON_CODE
+		WHERE  CD_GB = #{cdGb}
+		ORDER  BY DISP_ORD
+	</select>
+
+	<!-- 공통코드 등록/수정 -->
+	<insert id="saveCommonCode" parameterType="CommonCode">
+		/* TsaSystem.saveCommonCode */
+		INSERT INTO TB_COMMON_CODE (
+		       CD_GB
+		     , CD
+		     , CD_NM
+		     , CD_DESC
+		     , DISP_ORD
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{cdGb}
+		     , #{cd}
+		     , #{cdNm}
+		     , #{cdDesc}
+		     , #{dispOrd}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       CD_NM = #{cdNm}
+		     , CD_DESC = #{cdDesc}
+		     , DISP_ORD = #{dispOrd}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</insert>
+
+	<!-- 공통코드 삭제 -->
+	<delete id="deleteCommonCode" parameterType="CommonCode">
+		/* TsaSystem.deleteCode */
+		DELETE FROM TB_COMMON_CODE
+		WHERE  CD_GB = #{cdGb}
+		AND    CD = #{cd}
+	</delete>
+	
+	<!-- 샘플파일 목록 -->
+	<select id="getSampleFileList" resultType="SampleFile">
+		/* TsaSystem.getSampleFileList */
+		SELECT SAMPLE_FILE_ID
+		     , SAMPLE_FILE_NM
+		     , ORG_FILE_NM
+		     , SYS_FILE_NM
+		     , USE_YN
+		FROM   TB_SAMPLE_FILE
+		ORDER  BY SAMPLE_FILE_NM
+	</select>
+
+	<!-- 샘플파일 등록/수정 -->
+	<insert id="createSampleFile" parameterType="SampleFile">
+		/* TsaSystem.createSampleFile */
+		INSERT INTO TB_SAMPLE_FILE (
+		       SAMPLE_FILE_ID
+		     , SAMPLE_FILE_NM
+		     , ORG_FILE_NM
+		     , SYS_FILE_NM
+		     , USE_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       (SELECT CONCAT('SF',IFNULL(LPAD(CAST(SUBSTRING(MAX(SAMPLE_FILE_ID),3) AS UNSIGNED) + 1,3,'0'),'000'))
+		        FROM   TB_SAMPLE_FILE Z
+		       )
+		     , #{sampleFileNm}
+		     , #{orgFileNm}
+		     , #{sysFileNm}
+		     , #{useYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+	</insert>
+	
+	<!-- 샘플파일 등록/수정 -->
+	<update id="updateSampleFile" parameterType="SampleFile">
+		/* TsaSystem.updateSampleFile */
+		UPDATE TB_SAMPLE_FILE
+		SET    SAMPLE_FILE_NM = #{sampleFileNm}
+		     , ORG_FILE_NM = #{orgFileNm}
+		     , SYS_FILE_NM = #{sysFileNm}
+		     , USE_YN = #{useYn}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		WHERE  SAMPLE_FILE_ID = #{sampleFileId}
+	</update>
+
 </mapper>

+ 66 - 66
style24.admin/src/main/resources/config/application-locd.yml

@@ -1,66 +1,66 @@
-spring:
-    profiles:
-        active: locd
-    cache:
-        type: redis
-    redis:
-        lettuce:
-            pool:
-                max-active: 10
-                max-idle: 10
-                min-idle: 2
-        host: localhost
-        port: 6379
-        password: 
-
-logging:
-    config: classpath:log/logback-locd.xml
-    
-domain:
-    admin: //ldadmin.style24.com
-    front: //ldfront.style24.com
-    image: //ldimage.style24.com
-    uximage: //ldadmin.style24.com
-
-upload:
-    default:
-        target.path: /WIDE/workspace/files/data/style24
-        max.size: 10
-        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
-        view: //ldimage.style24.com
-    goods:
-        target.path: /WIDE/workspace/files/data/style24
-        max.size: 10
-        allow.extension: jpg|gif|jpeg|png
-        view: //image.style24.com/goods
-    image:
-        target.path: /WIDE/workspace/files/data/style24
-        max.size: 10
-        allow.extension: jpg|gif|jpeg|png
-        view: //ldimage.style24.com
-    excel:
-        target.path: /WIDE/workspace/files/data/style24
-        max.size: 10
-        allow.extension: xls|xlsx
-        view: //ldimage.style24.com/excel
-    sample:
-        target.path: /WIDE/workspace/files/data/style24
-        max.size: 10
-        allow.extension: txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
-        view: //ldimage.style24.com/sample
-
-download.path: /WIDE/workspace/files/data
-
-# SMTP(naver의 본인 username과 password, from(메일주소) 입려 후 테스트 하면 됨)
-mail:
-    host: mail.wivis.com
-    #    port: 465
-    username: admin@wivis.com
-    password: dnlqltm1!
-    protocol: smtp
-    #    tls: true
-    auth: true
-    from: admin@wivis.com
-    wivis.url: https://ldfront.style24.com
-    image.url: http://ldfront.style24.com/image/mailing
-    template.path: /WIDE/workspace/webapps/style24/STYLE24/style24.admin/src/main/webapp/WEB-INF/mail
+spring:
+    profiles:
+        active: locd
+    cache:
+        type: redis
+    redis:
+        lettuce:
+            pool:
+                max-active: 10
+                max-idle: 10
+                min-idle: 2
+        host: localhost
+        port: 6379
+        password: 
+
+logging:
+    config: classpath:log/logback-locd.xml
+    
+domain:
+    admin: //ldadmin.style24.com
+    front: //ldfront.style24.com
+    image: //ldimage.style24.com
+    uximage: //ldadmin.style24.com
+
+upload:
+    default:
+        target.path: /WIDE/workspace/files/data/style24
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        view: //ldimage.style24.com
+    goods:
+        target.path: /WIDE/workspace/files/data/style24
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.style24.com/goods
+    image:
+        target.path: /WIDE/workspace/files/data/style24
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //ldimage.style24.com
+    excel:
+        target.path: /WIDE/workspace/files/data/style24
+        max.size: 10
+        allow.extension: xls|xlsx
+        view: //ldimage.style24.com/excel
+    sample:
+        target.path: /WIDE/workspace/files/data/style24
+        max.size: 10
+        allow.extension: txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        view: //ldimage.style24.com/sample
+
+download.path: /WIDE/workspace/files/data
+
+# SMTP(naver의 본인 username과 password, from(메일주소) 입려 후 테스트 하면 됨)
+mail:
+    host: mail.wivis.com
+    #    port: 465
+    username: admin@wivis.com
+    password: dnlqltm1!
+    protocol: smtp
+    #    tls: true
+    auth: true
+    from: admin@wivis.com
+    wivis.url: https://ldfront.style24.com
+    image.url: http://ldfront.style24.com/image/mailing
+    template.path: /WIDE/workspace/webapps/style24/STYLE24/style24.admin/src/main/webapp/WEB-INF/mail

+ 82 - 82
style24.admin/src/main/resources/config/application-locp.yml

@@ -1,82 +1,82 @@
-spring:
-    profiles:
-        active: locp
-    cache:
-        type: redis
-    redis:
-        lettuce:
-            pool:
-                max-active: 10
-                max-idle: 10
-                min-idle: 2
-        host: localhost
-        port: 6379
-        password: 
-
-logging:
-    config: classpath:log/logback-locp.xml
-    
-domain:
-    admin: //lpadmin.wivismall.com
-    wivis: //lpfront.wivismall.com
-    image: //image.wivismall.com/speedy_image-wivismall
-    uximage: //lpadmin.wivismall.com
-
-upload:
-    default:
-        target.path: /WIDE/workspace/files/data
-        max.size: 10
-        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
-        view: //image.wivismall.com/speedy_image-wivismall
-    goods:
-        target.path: /WIDE/workspace/files/data
-        max.size: 10
-        allow.extension: jpg|gif|jpeg|png
-        view: //image.wivismall.com/speedy_image-wivismall/goods
-    image:
-        target.path: /WIDE/workspace/files/data
-        max.size: 10
-        allow.extension: jpg|gif|jpeg|png
-        view: //image.wivismall.com/speedy_image-wivismall
-    excel:
-        target.path: /WIDE/workspace/files/data
-        max.size: 10
-        allow.extension: xls|xlsx
-        view: //locp.image.wivismall.com/data/excel
-    sample:
-        target.path: /WIDE/workspace/files/data
-        max.size: 10
-        allow.extension: txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
-        view: //locp.image.wivismall.com/data/sample
-
-download.path: /WIDE/workspace/files/data
-
-# SMTP(naver의 본인 username과 password, from(메일주소) 입려 후 테스트 하면 됨)
-mail:
-    host: mail.wivis.com
-#    port: 465
-    username: admin@wivis.com
-    password: dnlqltm1!
-    protocol: smtp
-#    tls: true
-    auth: true
-    from: admin@wivis.com
-    wivis.url: //lpfront.wivismall.com
-    image.url: //lpfront.wivismall.com/image/mailing
-    template.path: /WIDE/workspace/webapps/wivis/wivismall.admin/src/main/webapp/WEB-INF/mail
-# 사방넷 API
-sabangnet:
-    xml:
-        path: /WIDE/workspace/webapps/wivis/wivismall.admin/src/main/webapp/sabangnet
-        url: http://112.172.147.34:88
-
-# PG
-pg:
-    nicepay:
-        merchantId: wivismallm
-        merchantKey: pXTdML8rIaOVCeXQQsyRp1uCfTSTT/n80BV4LCqa+/yJM64MYIqeBCIQdH1rKhJRwSOsdCxVPa1V6hRxkkdJxg==
-        cancelPwd: wivis@2020
-        log.path: /WIDE/workspace/logs/wivis
-        account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
-        vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp
-
+spring:
+    profiles:
+        active: locp
+    cache:
+        type: redis
+    redis:
+        lettuce:
+            pool:
+                max-active: 10
+                max-idle: 10
+                min-idle: 2
+        host: localhost
+        port: 6379
+        password: 
+
+logging:
+    config: classpath:log/logback-locp.xml
+    
+domain:
+    admin: //lpadmin.wivismall.com
+    wivis: //lpfront.wivismall.com
+    image: //image.wivismall.com/speedy_image-wivismall
+    uximage: //lpadmin.wivismall.com
+
+upload:
+    default:
+        target.path: /WIDE/workspace/files/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png|bmp|txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        view: //image.wivismall.com/speedy_image-wivismall
+    goods:
+        target.path: /WIDE/workspace/files/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.wivismall.com/speedy_image-wivismall/goods
+    image:
+        target.path: /WIDE/workspace/files/data
+        max.size: 10
+        allow.extension: jpg|gif|jpeg|png
+        view: //image.wivismall.com/speedy_image-wivismall
+    excel:
+        target.path: /WIDE/workspace/files/data
+        max.size: 10
+        allow.extension: xls|xlsx
+        view: //locp.image.wivismall.com/data/excel
+    sample:
+        target.path: /WIDE/workspace/files/data
+        max.size: 10
+        allow.extension: txt|doc|docx|ppt|pptx|xls|xlsx|hwp|pdf
+        view: //locp.image.wivismall.com/data/sample
+
+download.path: /WIDE/workspace/files/data
+
+# SMTP(naver의 본인 username과 password, from(메일주소) 입려 후 테스트 하면 됨)
+mail:
+    host: mail.wivis.com
+#    port: 465
+    username: admin@wivis.com
+    password: dnlqltm1!
+    protocol: smtp
+#    tls: true
+    auth: true
+    from: admin@wivis.com
+    wivis.url: //lpfront.wivismall.com
+    image.url: //lpfront.wivismall.com/image/mailing
+    template.path: /WIDE/workspace/webapps/wivis/wivismall.admin/src/main/webapp/WEB-INF/mail
+# 사방넷 API
+sabangnet:
+    xml:
+        path: /WIDE/workspace/webapps/wivis/wivismall.admin/src/main/webapp/sabangnet
+        url: http://112.172.147.34:88
+
+# PG
+pg:
+    nicepay:
+        merchantId: wivismallm
+        merchantKey: pXTdML8rIaOVCeXQQsyRp1uCfTSTT/n80BV4LCqa+/yJM64MYIqeBCIQdH1rKhJRwSOsdCxVPa1V6hRxkkdJxg==
+        cancelPwd: wivis@2020
+        log.path: /WIDE/workspace/logs/wivis
+        account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
+        vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp
+

+ 64 - 64
style24.admin/src/main/resources/config/application.yml

@@ -1,64 +1,64 @@
-spring:
-    messages:
-        cache-duration: -1
-        basename: classpath:i18n/messages/message
-        encoding: UTF-8
-    thymeleaf:
-        check-template-location: true
-        prefix: /WEB-INF/views/
-        suffix: .html
-    servlet:
-        multipart:
-            max-file-size: 30MB
-            max-request-size: 30MB
-
-server.error.whitelabel.enabled: false
-
-# 사방넷 API
-sabangnet:
-    wivis:
-        admin.id: hohomomo00
-        auth.key: TMYP5CEPHyuEx7K4xFPTAXPZd65NT88MyV
-    flyingtiger:
-        admin.id: js5353
-        auth.key: 36XBSHE2KW4MPBr3ZuT5FRF34MK9NK4uP
-
-# Instagram
-instagram:
-    api.url: https://api.instagram.com/v1
-    api.method: https://graph.instagram.com/[userId]/media?fields=id,media_type,media_url,permalink,thumbnail_url,username,caption,timestamp
-    token.url: https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token
-
-# 네이버 API
-naver:
-    clientId: OMmbCMu7ac7GgYWgjlhv
-    clientSecret: jwRNdDbEBG
-    shortUrl: https://openapi.naver.com/v1/util/shorturl
-
-# SPEEDY Image Upload
-speedy:
-    ftp:
-        host: fileupload.cdn.cloudn.co.kr
-        port: 21
-        username: speedy_image-wivismall
-        pwd: wZ31jS_!@
-        
-#카카오 API        
-kakao:
-  appId : 399207
-  appName : WIVISMALL
-  companyName : 위비스
-  restApiKey: 8f8db3657b60b2c83df79a37d38becd4           
-  nativeAppKey : a4790e2102950309d87ad81a39c0597d
-  javascriptKey : f435c12d89ddb9cc6337f4cf0a05fd30
-  adminKey : 567e9476b15d2149c714aaecd0fee740
-  addressApiRequestUrl : https://dapi.kakao.com/v2/local/search/address.json?page=1&query=
-  
-# CJ대한통운
-cj:
-    logistic:
-        custid: 30321070
-    call:
-        tel1: 02
-        tel2: 1544
-        tel3: 4097
+spring:
+    messages:
+        cache-duration: -1
+        basename: classpath:i18n/messages/message
+        encoding: UTF-8
+    thymeleaf:
+        check-template-location: true
+        prefix: /WEB-INF/views/
+        suffix: .html
+    servlet:
+        multipart:
+            max-file-size: 30MB
+            max-request-size: 30MB
+
+server.error.whitelabel.enabled: false
+
+# 사방넷 API
+sabangnet:
+    wivis:
+        admin.id: hohomomo00
+        auth.key: TMYP5CEPHyuEx7K4xFPTAXPZd65NT88MyV
+    flyingtiger:
+        admin.id: js5353
+        auth.key: 36XBSHE2KW4MPBr3ZuT5FRF34MK9NK4uP
+
+# Instagram
+instagram:
+    api.url: https://api.instagram.com/v1
+    api.method: https://graph.instagram.com/[userId]/media?fields=id,media_type,media_url,permalink,thumbnail_url,username,caption,timestamp
+    token.url: https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token
+
+# 네이버 API
+naver:
+    clientId: OMmbCMu7ac7GgYWgjlhv
+    clientSecret: jwRNdDbEBG
+    shortUrl: https://openapi.naver.com/v1/util/shorturl
+
+# SPEEDY Image Upload
+speedy:
+    ftp:
+        host: fileupload.cdn.cloudn.co.kr
+        port: 21
+        username: speedy_image-wivismall
+        pwd: wZ31jS_!@
+        
+#카카오 API        
+kakao:
+  appId : 399207
+  appName : WIVISMALL
+  companyName : 위비스
+  restApiKey: 8f8db3657b60b2c83df79a37d38becd4           
+  nativeAppKey : a4790e2102950309d87ad81a39c0597d
+  javascriptKey : f435c12d89ddb9cc6337f4cf0a05fd30
+  adminKey : 567e9476b15d2149c714aaecd0fee740
+  addressApiRequestUrl : https://dapi.kakao.com/v2/local/search/address.json?page=1&query=
+  
+# CJ대한통운
+cj:
+    logistic:
+        custid: 30321070
+    call:
+        tel1: 02
+        tel2: 1544
+        tel3: 4097

+ 79 - 79
style24.admin/src/main/resources/i18n/messages/message_ko_KR.properties

@@ -1,79 +1,79 @@
-## -----------------------------------------------------------------------------
-## Message properties
-## -----------------------------------------------------------------------------
-SUCC_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc218\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0004=\uc131\uacf5\uc801\uc73c\ub85c \ucc98\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0005=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0006=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0007=\uc131\uacf5\uc801\uc73c\ub85c \uc5c5\ub85c\ub4dc \ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-#SUCC_0008=\uc131\uacf5\uc801\uc73c\ub85c \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SUCC_0009=\uc131\uacf5\uc801\uc73c\ub85c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-FAIL_0001=\uc624\ub958\ub85c \uc778\ud574 \uc800\uc7a5\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0002=\uc624\ub958\ub85c \uc778\ud574 \uc218\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0003=\uc624\ub958\ub85c \uc778\ud574 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0004=\uc624\ub958\ub85c \uc778\ud574 \ucc98\ub9ac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0005=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\uc1a1\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0006=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\ud589\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0007=\uc624\ub958\ub85c \uc778\ud574 \uc5c5\ub85c\ub4dc \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-#FAIL_0008=\uc624\ub958\ub85c \uc778\ud574 \ub4f1\ub85d\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_0009=\uc624\ub958\ub85c \uc778\ud574 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
-FAIL_1001=\uc800\uc7a5\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-FAIL_1002=\uc804\uc1a1\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-FAIL_1003=\uc5d1\uc140\ub2e4\uc6b4\ub85c\ub4dc\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-FAIL_1004=\uc0ad\uc81c\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-
-LOGN_0001=\uc785\ub825\ud558\uc2e0 \uc815\ubcf4\ub85c \uac00\uc785\ub41c \ub0b4\uc5ed\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-LOGN_0002=\ube44\ubc00\ubc88\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-LOGN_0003=\ub85c\uadf8\uc778 \uc0c1\ud0dc\uac00 \uc544\ub2d9\ub2c8\ub2e4. \ub2e4\uc2dc \ub85c\uadf8\uc778 \ud574\uc8fc\uc138\uc694.
-LOGN_0004=\ube44\ubc00\ubc88\ud638\ub97c \ubcc0\uacbd\ud55c \ub0a0\ub85c\ubd80\ud130 3\uac1c\uc6d4\uc774 \uacbd\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-##\uc8fc\ubb38
-ORDER_0001=\uc8fc\ubb38\uc815\ubcf4\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0002=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\ucd9c\uace0\uc644\ub8cc] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc0c1\ud488\uc900\ube44\uc911\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0003=\ud574\ub2f9 \uc0c1\ud488 \ube0c\ub79c\ub4dc \uc218\uc815 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0004=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911][\uad6c\ub9e4\ud655\uc815] \uc0c1\ud0dc\uc5d0\ub9cc \uc1a1\uc7a5\ubc88\ud638\ub97c \uc785\ub825\ud558\uc2e4\uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0005=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad6c\ub9e4\ud655\uc815 \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0006=\uad6c\ub9e4\ud655\uc815\uc744 \ud558\uc2e4\uc218 \uc788\ub294 \uc0c1\ud488\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \n\ubc18\ud488\uc774\ub098 \uad50\ud658\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0007=\uc8fc\ubb38 \uc804\uccb4\ucde8\uc18c\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0008=\ud0c0 \uc5c5\uccb4\uc758 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \ubc18\ud488\uc744 \uc9c4\ud589\ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0009=\ud3ec\uc778\ud2b8 \uc6d0\ubcf5 \ucc98\ub9ac\ub97c \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4.
-ORDER_0010=\uacb0\uc81c \ucde8\uc18c\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4.
-ORDER_0011=\uce74\ub4dc \uacb0\uc81c\uc778 \uacbd\uc6b0\uc5d0\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0012=\ucde8\uc18c\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ucde8\uc18c\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
-ORDER_0013=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\uc0c1\ud488\uc900\ube44\uc911]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0014=\ucd9c\uace0\uc644\ub8cc\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uc8fc\ubb38 \ucde8\uc18c\uc2e0\uccad\ub41c \uc8fc\ubb38\uc744 \uba3c\uc800 \ucc98\ub9ac\ud574\uc8fc\uc2dc\uae30\ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0015=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc8fc\ubb38\uad50\ud658\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0016=\uad50\ud658\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694.\uad50\ud658\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
-ORDER_0017=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0018=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0019=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0020=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0021=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0022=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0023=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0024=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
-ORDER_0025=\ubc18\ud488\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ubc18\ud488\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
-ORDER_0026=\uc8fc\ubb38 \uc804\uccb4\ubc18\ud488\uc744 \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
-ORDER_0027=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uacb0\uc81c\uc644\ub8cc \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0028=\uacb0\uc81c \uc644\ub8cc \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\ucde8\uc18c,\ubc18\ud488\uc774 \uc644\ub8cc\ub41c \uc8fc\ubb38\uc785\ub2c8\ub2e4.
-ORDER_0029=\uc8fc\ubb38 \uc0c1\ud0dc\ub97c \ud655\uc778\ud574 \uc8fc\uc138\uc694. [\ucd9c\uace0\uc911][\uad6c\ub9e4\ud655\uc815]\uc0c1\ud0dc\uc778 \uc8fc\ubb38\uac74\uc774 \uc788\uc2b5\ub2c8\ub2e4.
-ORDER_0030=\ud544\uc218\uac12\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
-ORDER_0031=\uc8fc\ubb38\uc804\uccb4\ucde8\uc18c \ucc98\ub9ac\uac00 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-
-#\uc0ac\ubc29\ub137
-SABANGNET_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
-SABANGNET_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc1fc\ud551\ubab0\ubcc4 DATA \uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
-SABANGNET_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc694\uc57d \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
-SABANGNET_0004=\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5, \uc2e4\ud328: {2}\uac74)
-SABANGNET_0005=\uc131\uacf5\uc801\uc73c\ub85c \uc1a1\uc7a5\ubc88\ud638\uac00 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
-SABANGNET_0006=\ucde8\uc18c\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
-SABANGNET_0007=\uad50\ud658\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
-SABANGNET_0008=\ubc18\ud488\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
-SABANGNET_0009=\uc720\ud6a8\uc131 \uac80\uc99d \uc2e4\ud328\ub85c \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
-SABANGNET_0010=\ucd9c\uace0\ub97c \uc704\ud574 ERP\ub85c \uc804\uc1a1\ud558\uc600\uc2b5\ub2c8\ub2e4.(\uc131\uacf5: {0}\uac74, \uc2e4\ud328: {1}\uac74)
-
-#\ubc30\uc1a1
-DELIVERY_0001=\ub4f1\ub85d \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc774\ubbf8 \ub4f1\ub85d\ub41c \ucd9c\uace0\uae08\uc9c0 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4.
+## -----------------------------------------------------------------------------
+## Message properties
+## -----------------------------------------------------------------------------
+SUCC_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc218\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0004=\uc131\uacf5\uc801\uc73c\ub85c \ucc98\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0005=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0006=\uc131\uacf5\uc801\uc73c\ub85c \ubc1c\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0007=\uc131\uacf5\uc801\uc73c\ub85c \uc5c5\ub85c\ub4dc \ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+#SUCC_0008=\uc131\uacf5\uc801\uc73c\ub85c \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SUCC_0009=\uc131\uacf5\uc801\uc73c\ub85c \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+
+FAIL_0001=\uc624\ub958\ub85c \uc778\ud574 \uc800\uc7a5\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0002=\uc624\ub958\ub85c \uc778\ud574 \uc218\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0003=\uc624\ub958\ub85c \uc778\ud574 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0004=\uc624\ub958\ub85c \uc778\ud574 \ucc98\ub9ac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0005=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\uc1a1\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0006=\uc624\ub958\ub85c \uc778\ud574 \ubc1c\ud589\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0007=\uc624\ub958\ub85c \uc778\ud574 \uc5c5\ub85c\ub4dc \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+#FAIL_0008=\uc624\ub958\ub85c \uc778\ud574 \ub4f1\ub85d\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_0009=\uc624\ub958\ub85c \uc778\ud574 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.
+FAIL_1001=\uc800\uc7a5\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+FAIL_1002=\uc804\uc1a1\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+FAIL_1003=\uc5d1\uc140\ub2e4\uc6b4\ub85c\ub4dc\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+FAIL_1004=\uc0ad\uc81c\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+
+LOGN_0001=\uc785\ub825\ud558\uc2e0 \uc815\ubcf4\ub85c \uac00\uc785\ub41c \ub0b4\uc5ed\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
+LOGN_0002=\ube44\ubc00\ubc88\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
+LOGN_0003=\ub85c\uadf8\uc778 \uc0c1\ud0dc\uac00 \uc544\ub2d9\ub2c8\ub2e4. \ub2e4\uc2dc \ub85c\uadf8\uc778 \ud574\uc8fc\uc138\uc694.
+LOGN_0004=\ube44\ubc00\ubc88\ud638\ub97c \ubcc0\uacbd\ud55c \ub0a0\ub85c\ubd80\ud130 3\uac1c\uc6d4\uc774 \uacbd\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+
+##\uc8fc\ubb38
+ORDER_0001=\uc8fc\ubb38\uc815\ubcf4\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0002=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\ucd9c\uace0\uc644\ub8cc] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc0c1\ud488\uc900\ube44\uc911\uc73c\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0003=\ud574\ub2f9 \uc0c1\ud488 \ube0c\ub79c\ub4dc \uc218\uc815 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0004=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911][\uad6c\ub9e4\ud655\uc815] \uc0c1\ud0dc\uc5d0\ub9cc \uc1a1\uc7a5\ubc88\ud638\ub97c \uc785\ub825\ud558\uc2e4\uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0005=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad6c\ub9e4\ud655\uc815 \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0006=\uad6c\ub9e4\ud655\uc815\uc744 \ud558\uc2e4\uc218 \uc788\ub294 \uc0c1\ud488\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \n\ubc18\ud488\uc774\ub098 \uad50\ud658\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0007=\uc8fc\ubb38 \uc804\uccb4\ucde8\uc18c\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0008=\ud0c0 \uc5c5\uccb4\uc758 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \ubc18\ud488\uc744 \uc9c4\ud589\ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0009=\ud3ec\uc778\ud2b8 \uc6d0\ubcf5 \ucc98\ub9ac\ub97c \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4.
+ORDER_0010=\uacb0\uc81c \ucde8\uc18c\ub97c \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4.
+ORDER_0011=\uce74\ub4dc \uacb0\uc81c\uc778 \uacbd\uc6b0\uc5d0\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0012=\ucde8\uc18c\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ucde8\uc18c\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
+ORDER_0013=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uacb0\uc81c\uc644\ub8cc][\uc0c1\ud488\uc900\ube44\uc911]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubd80\ubd84\ucde8\uc18c\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0014=\ucd9c\uace0\uc644\ub8cc\ub97c \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uc8fc\ubb38 \ucde8\uc18c\uc2e0\uccad\ub41c \uc8fc\ubb38\uc744 \uba3c\uc800 \ucc98\ub9ac\ud574\uc8fc\uc2dc\uae30\ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0015=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucd9c\uace0\uc644\ub8cc]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uc8fc\ubb38\uad50\ud658\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0016=\uad50\ud658\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694.\uad50\ud658\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
+ORDER_0017=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0018=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0019=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uad50\ud658\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uad50\ud658\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0020=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc9c4\ud589\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0021=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc9c4\ud589]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0022=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ubc18\ud488\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ubc18\ud488\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0023=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\ubc18\ub824\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0024=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\ucde8\uc18c\uc2e0\uccad]\uc0c1\ud0dc\uc5d0\uc11c\ub9cc \ucde8\uc18c\uc644\ub8cc\uac00 \uac00\ub2a5\ud569\ub2c8\ub2e4.
+ORDER_0025=\ubc18\ud488\uc218\ub7c9\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \ubc18\ud488\uac00\ub2a5 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc2b5\ub2c8\ub2e4.
+ORDER_0026=\uc8fc\ubb38 \uc804\uccb4\ubc18\ud488\uc744 \ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uad50\ud658,\ubc18\ud488,\ucde8\uc18c\uc911\uc778 \uc0c1\ud488\uc774 \uc788\ub294\uc9c0 \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4.
+ORDER_0027=\uc8fc\ubb38\uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\n[\uc0c1\ud488\uc900\ube44\uc911] \uc0c1\ud0dc\uc5d0\uc11c\ub9cc \uacb0\uc81c\uc644\ub8cc \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0028=\uacb0\uc81c \uc644\ub8cc \uc0c1\ud0dc\ub85c \ubcc0\uacbd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\ucde8\uc18c,\ubc18\ud488\uc774 \uc644\ub8cc\ub41c \uc8fc\ubb38\uc785\ub2c8\ub2e4.
+ORDER_0029=\uc8fc\ubb38 \uc0c1\ud0dc\ub97c \ud655\uc778\ud574 \uc8fc\uc138\uc694. [\ucd9c\uace0\uc911][\uad6c\ub9e4\ud655\uc815]\uc0c1\ud0dc\uc778 \uc8fc\ubb38\uac74\uc774 \uc788\uc2b5\ub2c8\ub2e4.
+ORDER_0030=\ud544\uc218\uac12\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.
+ORDER_0031=\uc8fc\ubb38\uc804\uccb4\ucde8\uc18c \ucc98\ub9ac\uac00 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+
+#\uc0ac\ubc29\ub137
+SABANGNET_0001=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
+SABANGNET_0002=\uc131\uacf5\uc801\uc73c\ub85c \uc1fc\ud551\ubab0\ubcc4 DATA \uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
+SABANGNET_0003=\uc131\uacf5\uc801\uc73c\ub85c \uc0c1\ud488 \uc694\uc57d \uc815\ubcf4\uac00 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5)
+SABANGNET_0004=\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc131\uacf5, \uc2e4\ud328: {2}\uac74)
+SABANGNET_0005=\uc131\uacf5\uc801\uc73c\ub85c \uc1a1\uc7a5\ubc88\ud638\uac00 \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+SABANGNET_0006=\ucde8\uc18c\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
+SABANGNET_0007=\uad50\ud658\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
+SABANGNET_0008=\ubc18\ud488\uc8fc\ubb38\uc774 \uc218\uc9d1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.(\ucd1d {0}\uac74 \uc911 {1}\uac74 \uc2e4\ud328 {2}\uac74 \uc131\uacf5)
+SABANGNET_0009=\uc720\ud6a8\uc131 \uac80\uc99d \uc2e4\ud328\ub85c \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+SABANGNET_0010=\ucd9c\uace0\ub97c \uc704\ud574 ERP\ub85c \uc804\uc1a1\ud558\uc600\uc2b5\ub2c8\ub2e4.(\uc131\uacf5: {0}\uac74, \uc2e4\ud328: {1}\uac74)
+
+#\ubc30\uc1a1
+DELIVERY_0001=\ub4f1\ub85d \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc774\ubbf8 \ub4f1\ub85d\ub41c \ucd9c\uace0\uae08\uc9c0 \uc0c1\ud488\uc774 \uc788\uc2b5\ub2c8\ub2e4.

+ 187 - 187
style24.admin/src/main/webapp/WEB-INF/views/board/FaqDetailForm.html

@@ -1,187 +1,187 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : FaqDetailForm.html
- * @desc    : FAQ 상세 팝업 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.29   gagamel     최초 작성
- *******************************************************************************
- -->
-<div class="modalPopup" data-width="1200" id="popupFaq">
-	<div class="panelStyle">
-		<!-- TITLE -->
-		<div class="panelTitle">
-			<strong th:text="${'FAQ ' + (mode == 'N' ? '등록' : '상세')}">FAQ 상세</strong>
-			<button type="button" class="close" onclick="uifnPopupClose('popupFaq');"><em class="fa fa-times"></em></button>
-		</div>
-		<!-- //TITLE -->
-		
-		<!-- CONTENT -->
-		<div class="panelContent" th:if="${mode == 'N'}">
-			<form id="faqDetailForm" name="faqDetailForm" action="#" th:action="@{'/board/faq/save'}" th:method="post">
-				<input type="hidden" name="mode" th:value="${mode}"/>
-				
-				<table class="frmStyle" aria-describedby="등록폼">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<th>FAQ번호</th>
-							<td>
-								<input type="text" name="faqSq" maxlength="20" placeholder="자동생성" readonly="readonly"/>
-							</td>
-							<th>사이트<em class="required" title="필수"></em></th>
-							<td>
-								<select name="siteCd" required="required">
-									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
-								</select>
-							</td>
-							<th>FAQ유형<em class="required" title="필수"></em></th>
-							<td>
-								<select name="faqType" required="required">
-									<option th:if="${faqTypeList}" th:each="oneData, status : ${faqTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
-								</select>
-							</td>
-							<th>사용여부<em class="required" title="필수"></em></th>
-							<td>
-								<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked"/>Yes</label>
-								<label class="rdoBtn"><input type="radio" name="useYn" value="N"/>No</label>
-							</td>
-						</tr>
-						<tr>
-							<th>질문<em class="required" title="필수"></em></th>
-							<td colspan="7">
-								<input type="text" name="question" maxlength="200" required="required" data-valid-name="질문"/>
-							</td>
-						</tr>
-						<tr>
-							<th>답변<em class="required" title="필수"></em></th>
-							<td colspan="7">
-								<textarea class="textareaR4" id="answer" name="answer" data-valid-name="답변"></textarea>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-			</form>
-		</div>
-		
-		<div class="panelContent" th:if="${mode == 'U'}">
-			<form id="faqDetailForm" name="faqDetailForm" action="#" th:action="@{'/board/faq/save'}" th:method="post" th:object="${faqInfo}">
-				<input type="hidden" name="mode" th:value="${mode}"/>
-				
-				<table class="frmStyle" aria-describedby="상세폼">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<th>FAQ번호</th>
-							<td>
-								<input type="text" name="faqSq" maxlength="20" placeholder="자동생성" readonly="readonly" th:field="*{faqSq}"/>
-							</td>
-							<th>사이트<em class="required" title="필수"></em></th>
-							<td>
-								<select name="siteCd" required="required" th:field="*{siteCd}">
-									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|" th:selected="${siteCd == oneData.cd}"></option>
-								</select>
-							</td>
-							<th>FAQ유형<em class="required" title="필수"></em></th>
-							<td>
-								<select name="faqType" required="required" th:field="*{faqType}">
-									<option th:if="${faqTypeList}" th:each="oneData, status : ${faqTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|" th:selected="${faqType == oneData.cd}"></option>
-								</select>
-							</td>
-							<th>사용여부<em class="required" title="필수"></em></th>
-							<td>
-								<label class="rdoBtn"><input type="radio" name="useYn" value="Y" th:field="*{useYn}"/>Yes</label>
-								<label class="rdoBtn"><input type="radio" name="useYn" value="N" th:field="*{useYn}"/>No</label>
-							</td>
-						</tr>
-						<tr>
-							<th>질문<em class="required" title="필수"></em></th>
-							<td colspan="5">
-								<input type="text" name="question" placeholder="" maxlength="200" required="required" data-valid-name="질문" th:field="*{question}"/>
-							</td>
-							<th>조회수</th>
-							<td><input type="text" name="readCnt" class="w50 aR" readonly="readonly" th:field="*{readCnt}"/></td>
-						</tr>
-						<tr>
-							<th>답변<em class="required" title="필수"></em></th>
-							<td colspan="7">
-								<textarea class="textareaR4" id="answer" name="answer" data-valid-name="답변" th:field="*{answer}"></textarea>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-			</form>
-		</div>
-		<!-- //CONTENT -->
-
-		<!-- 버튼 배치 영역 -->
-		<ul class="panelBar">
-			<li class="right">
-				<button type="button" class="btn btn-info btn-lg" id="btnSaveFaq">저장</button>
-			</li>
-		</ul>
-		<!-- //버튼 배치 영역 -->
-	</div>
-</div>
-
-<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020102902"></script>
-<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=20201030"></script>
-<script th:inline="javascript">
-/*<![CDATA[*/
-	// 저장
-	$('#btnSaveFaq').on('click', function() {
-		// 입력 값 체크
-		if (!gagajf.validation('#faqDetailForm'))
-			return false;
-		
-		if (gagajf.isNull($('#answer').val())) {
-			mcxDialog.alert('답변을 입력해 주세요.');
-			return false;
-		}
-		
-		mcxDialog.confirm("저장하시겠습니까?", {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				gagajf.ajaxFormSubmit($('#faqDetailForm').prop('action'), '#faqDetailForm', function() {
-					uifnPopupClose('popupFaq');
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	$(document).ready(function() {
-		// Create a summernote
-		let snOptions = gagaSn.getToolbarOptions();
-		gagaSn.createSummernote(snOptions, '#answer');
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : FaqDetailForm.html
+ * @desc    : FAQ 상세 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.29   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupFaq">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong th:text="${'FAQ ' + (mode == 'N' ? '등록' : '상세')}">FAQ 상세</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupFaq');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent" th:if="${mode == 'N'}">
+			<form id="faqDetailForm" name="faqDetailForm" action="#" th:action="@{'/board/faq/save'}" th:method="post">
+				<input type="hidden" name="mode" th:value="${mode}"/>
+				
+				<table class="frmStyle" aria-describedby="등록폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>FAQ번호</th>
+							<td>
+								<input type="text" name="faqSq" maxlength="20" placeholder="자동생성" readonly="readonly"/>
+							</td>
+							<th>사이트<em class="required" title="필수"></em></th>
+							<td>
+								<select name="siteCd" required="required">
+									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+							<th>FAQ유형<em class="required" title="필수"></em></th>
+							<td>
+								<select name="faqType" required="required">
+									<option th:if="${faqTypeList}" th:each="oneData, status : ${faqTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+							<th>사용여부<em class="required" title="필수"></em></th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked"/>Yes</label>
+								<label class="rdoBtn"><input type="radio" name="useYn" value="N"/>No</label>
+							</td>
+						</tr>
+						<tr>
+							<th>질문<em class="required" title="필수"></em></th>
+							<td colspan="7">
+								<input type="text" name="question" maxlength="200" required="required" data-valid-name="질문"/>
+							</td>
+						</tr>
+						<tr>
+							<th>답변<em class="required" title="필수"></em></th>
+							<td colspan="7">
+								<textarea class="textareaR4" id="answer" name="answer" data-valid-name="답변"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+		
+		<div class="panelContent" th:if="${mode == 'U'}">
+			<form id="faqDetailForm" name="faqDetailForm" action="#" th:action="@{'/board/faq/save'}" th:method="post" th:object="${faqInfo}">
+				<input type="hidden" name="mode" th:value="${mode}"/>
+				
+				<table class="frmStyle" aria-describedby="상세폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>FAQ번호</th>
+							<td>
+								<input type="text" name="faqSq" maxlength="20" placeholder="자동생성" readonly="readonly" th:field="*{faqSq}"/>
+							</td>
+							<th>사이트<em class="required" title="필수"></em></th>
+							<td>
+								<select name="siteCd" required="required" th:field="*{siteCd}">
+									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|" th:selected="${siteCd == oneData.cd}"></option>
+								</select>
+							</td>
+							<th>FAQ유형<em class="required" title="필수"></em></th>
+							<td>
+								<select name="faqType" required="required" th:field="*{faqType}">
+									<option th:if="${faqTypeList}" th:each="oneData, status : ${faqTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|" th:selected="${faqType == oneData.cd}"></option>
+								</select>
+							</td>
+							<th>사용여부<em class="required" title="필수"></em></th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="useYn" value="Y" th:field="*{useYn}"/>Yes</label>
+								<label class="rdoBtn"><input type="radio" name="useYn" value="N" th:field="*{useYn}"/>No</label>
+							</td>
+						</tr>
+						<tr>
+							<th>질문<em class="required" title="필수"></em></th>
+							<td colspan="5">
+								<input type="text" name="question" placeholder="" maxlength="200" required="required" data-valid-name="질문" th:field="*{question}"/>
+							</td>
+							<th>조회수</th>
+							<td><input type="text" name="readCnt" class="w50 aR" readonly="readonly" th:field="*{readCnt}"/></td>
+						</tr>
+						<tr>
+							<th>답변<em class="required" title="필수"></em></th>
+							<td colspan="7">
+								<textarea class="textareaR4" id="answer" name="answer" data-valid-name="답변" th:field="*{answer}"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+		<!-- //CONTENT -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnSaveFaq">저장</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+	</div>
+</div>
+
+<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020102902"></script>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=20201030"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 저장
+	$('#btnSaveFaq').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#faqDetailForm'))
+			return false;
+		
+		if (gagajf.isNull($('#answer').val())) {
+			mcxDialog.alert('답변을 입력해 주세요.');
+			return false;
+		}
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#faqDetailForm').prop('action'), '#faqDetailForm', function() {
+					uifnPopupClose('popupFaq');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	$(document).ready(function() {
+		// Create a summernote
+		let snOptions = gagaSn.getToolbarOptions();
+		gagaSn.createSummernote(snOptions, '#answer');
+	});
+/*]]>*/
+</script>
+
+</html>

+ 523 - 523
style24.admin/src/main/webapp/WEB-INF/views/board/NoticeForm.html

@@ -1,523 +1,523 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : NoticeForm.html
- * @desc    : 공지사항관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.30   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/board/notice/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<input type="hidden" name="noticeType" th:value="${noticeType}"/> <!-- 공지유형(10:사이트공지, 20:내부공지) -->
-				
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col width="10%"/>
-						<col width="23%"/>
-						<col width="10%"/>
-						<col width="23%"/>
-						<col width="10%"/>
-						<col width="24%"/>
-					</colgroup>
-					<tr>
-						<th>등록기간</th>
-						<td colspan="5" id="noticeTerms">
-						</td>
-					</tr>
-					<tr>
-						<th th:text="${noticeType == 'G047_10' ? '사이트' : '부서'}">수신자</th>
-						<td>
-							<select name="receiverId">
-								<option value="">[전체]</option>
-								<option th:if="${noticeReceiverList}" th:each="oneData, status : ${noticeReceiverList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>공지제목</th>
-						<td>
-							<input name="noteicTitle" type="text" maxlength="200"/>
-						</td>
-						<th>사용여부</th>
-						<td>
-							<select name="useYn">
-								<option value="">[전체]</option>
-								<option value="Y">[Y] Yes</option>
-								<option value="N">[N] No</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
-		</div>
-		<!-- //리스트 영역 -->
-		
-		<!-- 등록/수정 -->
-		<div class="panelStyle">
-			<form id="detailForm" name="detailForm" action="#" th:action="@{'/board/notice/save'}">
-				<input type="hidden" name="noticeType" th:value="${noticeType}"/> <!-- 공지유형(10:사이트공지, 20:내부공지) -->
-				<input type="hidden" name="noticeStdt"/> <!-- 공지시작일자 -->
-				<input type="hidden" name="noticeEddt"/> <!-- 공지종료일자 -->
-				
-				<table class="frmStyle" aria-describedby="등록/수정 폼">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-					</colgroup>
-					<tr>
-						<th>공지번호</th>
-						<td>
-							<input type="text" class="w100" name="noticeSq" placeholder="자동부여" readonly="readonly"/>
-						</td>
-						<th>긴급공지여부</th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="urgentYn" value="N" checked="checked">일반</label>
-							<label class="rdoBtn"><input type="radio" name="urgentYn" value="Y">긴급</label>
-						</td>
-						<th>사용여부</th>
-						<td>
-							<input type="hidden" name="useYn"/>
-							<label class="chkBox"><input type="checkbox" name="chkUseYn" checked="checked" value="Y"/>사용</label>
-						</td>
-					</tr>
-					<tr id="trNew">
-						<th>공지기간<i class="required" title="필수"></i></th>
-						<td colspan="5">
-							<input type="text" class="schDate w100" name="noticeStdt1" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-							~
-							<input type="text" class="schDate w100" name="noticeEddt1" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
-						</td>
-					</tr>
-					<tr id="trDetail" style="display: none;">
-						<th>공지기간<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="schDate w100" name="noticeStdt2" maxlength="10"/>
-							~
-							<input type="text" class="schDate w100" name="noticeEddt2" maxlength="10"/>
-						</td>
-						<th>조회수</th>
-						<td>
-							<input type="text" class="w100 aR" name="readCnt" readonly="readonly"/>
-						</td>
-						<th>등록자/등록일</th>
-						<td>
-							<input type="text" class="w100" name="regNm" readonly="readonly"/>
-							/
-							<input type="text" class="w100" name="regDt" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}" readonly="readonly"/>
-						</td>
-					</tr>
-					<tr>
-						<th><span th:text="${noticeType == 'G047_10' ? '사이트' : '부서'}">수신자</span><i class="required" title="필수"></i></th>
-						<td colspan="5">
-							<label class="chkBox" th:if="${noticeReceiverList}" th:each="oneData, status : ${noticeReceiverList}">
-								<input type="checkbox" name="receiverIds" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
-							</label>
-						</td>
-					</tr>
-					<tr>
-						<th>제목<i class="required" title="필수"></i></th>
-						<td colspan="5">
-							<input type="text" name="noticeTitle" required="required" data-valid-name="제목"/>
-						</td>
-					</tr>
-					<tr>
-						<th>공지내용<i class="required" title="필수"></i></th>
-						<td colspan="5">
-							<textarea class="textareaR4" name="noticeContent" id="noticeContent"></textarea>
-						</td>
-					</tr>
-					<tr>
-						<th>파일첨부</th>
-						<td colspan="5">
-							<div id="registeredFile"></div>
-							<div style="display: block">
-								<select name="fileCnt" id="fileCnt">
-									<th:block th:each="num: ${#numbers.sequence(1,10)}">
-										<option th:value="${num}" th:text="${num}"></option>
-									</th:block>
-								</select>* 파일 개수 선택(10개까지 가능)
-							</div>
-							<th:block th:each="num: ${#numbers.sequence(1,10)}">
-								<div>
-									<div class="uFile w500">
-										<input type="file" th:id="${'file' + num}" th:name="${'file' + num}" class="uFileInput w500"/>
-										<label th:for="${'file' + num}" class="uFileLabel">파일선택</label>
-										<input type="hidden" name="orgFileNms" th:id="${'orgFileNm' + num}"/>
-										<input type="hidden" name="sysFileNms" th:id="${'sysFileNm' + num}"/>
-									</div>
-									<br/>
-								</div>
-							</th:block>
-						</td>
-					</tr>
-				</table>
-			</form>
-			
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
-					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-		</div>
-		<!-- 등록/수정 -->
-	</div>
-
-<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
-<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=2020103001"></script>
-<script th:inline="javascript">
-/*<![CDATA[*/
-	// 공지사항유형(10:사이트공지, 20:내부공지)
-	let noticeType = [[${noticeType}]];
-
-	let columnDefs = [
-		{headerName: "공지번호", field: "noticeSq", width: 90, cellClass: 'text-center'},
-		{
-			headerName: "긴급공지", field: "urgentYn", width:90, cellClass: 'text-center',
-			cellRenderer: function(params) { return params.value == 'Y' ? '긴급' : '일반'; }
-		},
-// 		{headerName: "사이트", field: "siteNm", width: 200, cellClass: 'text-center'},
-		{
-			headerName: "공지제목", field: "noticeTitle", width: 500,
-			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
-		},
-		{
-			headerName: "파일", field: "fileCnt", width: 50, cellClass: 'text-center',
-			cellRenderer: function(params) { return params.value > 0 ? '<i class="fa fa-folder fa-lg"></i>' : ''; }
-		},
-		{headerName: "공지내용", field: "noticeContent", width: 500, hide: true },
-		{
-			headerName: "공지시작일", field: "noticeStdt", width:120, cellClass: 'text-center',
-			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
-		},
-		{
-			headerName: "공지종료일", field: "noticeEddt", width:120, cellClass: 'text-center',
-			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
-		},
-		{headerName: "조회수", field: "readCnt", width:90, cellClass: 'text-center'},
-		{headerName: "사용여부", field: "useYn", width:90, cellClass: 'text-center'},
-		{headerName: "등록자", field: "regNm", width:90, cellClass: 'text-center'},
-		{
-			headerName: "등록일자", field: "regDt", width:120, cellClass: 'text-center',
-			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
-		}
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// Cell click
-	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'noticeTitle')
-			return;
-		
-		$('#trNew').hide();
-		$('#trDetail').show();
-
-		$('#detailForm input[name=noticeSq]').val(event.data.noticeSq);
-		$('#detailForm input[name=noticeType]').val(event.data.noticeType);
-
-		if (event.data.urgentYn == 'Y') {
-			$('#detailForm input:radio[name=urgentYn]').eq(1).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=urgentYn]').eq(0).trigger('click');
-		}
-
-		if (event.data.useYn == 'Y') {
-			$('#detailForm input:checkbox[name=chkUseYn]').prop('checked', true);
-		} else {
-			$('#detailForm input:checkbox[name=chkUseYn]').prop('checked', false);
-		}
-		
-		$('#detailForm input[name=noticeStdt2]').val(event.data.noticeStdt.toDate("YYYYMMDD").format("YYYY-MM-DD"));
-		$('#detailForm input[name=noticeEddt2]').val(event.data.noticeEddt.toDate("YYYYMMDD").format("YYYY-MM-DD"));
-		$('#detailForm input[name=readCnt]').val(event.data.readCnt);
-		$('#detailForm input[name=regNm]').val(event.data.regNm);
-		$('#detailForm input[name=regDt]').val(event.data.regDt.toDate("YYYYMMDD").format("YYYY-MM-DD"));
-		$('#detailForm input[name=noticeTitle]').val(event.data.noticeTitle);
-
-		// 공지내용. Summernote에 값 세팅
-		gagaSn.setContents('#noticeContent', event.data.noticeContent);
-
-		// 수신자 목록
-		fnGetNoticeReceiverList(event.data.noticeSq);
-
-		// 파일 목록
-		fnGetNoticeFileList(event.data.noticeSq);
-	}
-
-	// 검색
-	$('#btnSearch').on('click', function() {
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-	
-	// 수신자 목록 조회
-	var fnGetNoticeReceiverList = function(noticeSq) {
-		let actionUrl = '/board/notice/receiver/list/' + noticeSq;
-		if (noticeType == 'G047_20') {
-			actionUrl = '/renderer/avail/commonCode/list/G048'; // 부서
-		}
-		
-		$.getJSON(actionUrl
-			, function(result) {
-				// 수신자 체크박스 체크 제거
-				$('#detailForm input:checkbox[name=receiverIds]').prop('checked', false);
-	
-				// 체크박스 개수
-				var chkboxCnt = $('#detailForm input:checkbox[name=receiverIds]').length;
-	
-				// 데이터 개수
-				var dataCnt = result.length;
-	
-				if (dataCnt > 0) {
-					for (var i = 0; i < chkboxCnt; i++) {
-						for (var j = 0; j < dataCnt; j++){
-							var data = result[j].receiverId;
-							if ($('#detailForm input:checkbox[name=receiverIds]').eq(i).val() == data) {
-								$('#detailForm input:checkbox[name=receiverIds]').eq(i).prop('checked', true);
-							}
-						}
-					}
-				}
-			});
-	}
-	
-	// 파일 조회
-	var fnGetNoticeFileList = function(noticeSq) {
-		$.getJSON('/board/notice/file/list/' + noticeSq
-			, function(result) {
-				if (result.length == 0) {
-					$('#registeredFile').html('');
-				} else {
-					$.each(result, function(idx, item) {
-						var tag = '';
-						tag += '<span class="memAdd">';
-						tag += '	<a id="dnFile' + (idx + 1) + '" href="#" onclick="fnDownloadFile(' + (idx + 1) + ', \'' + item.sysFileNm + '\');">' + item.orgFileNm + '</a>\n';
-						tag += '	<button type="button" onclick="fnDeleteFile(this, ' + item.noticeSq + ', ' + item.seq + ', \'' + item.sysFileNm + '\');">삭제</button>\n';
-						tag += '</span>';
-						$('#registeredFile').prepend(tag);
-					});
-				}
-			});
-	}
-	
-	// 파일다운로드
-	var fnDownloadFile = function(idx, fileNm) {
-		$('#dnFile' + idx).attr({
-			href : _uploadDefaultUrl + '/board/' + fileNm,
-			target: '_blank'
-		}).get(0).click();
-	}
-	
-	// 첨부파일 삭제
-	var fnDeleteFile = function(obj, noticeSq, seq, sysFileNm) {
-		mcxDialog.confirm('정말 삭제하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				var params = new Object();
-				params.noticeSq = noticeSq;
-				params.seq = seq;
-				params.sysFileNm = sysFileNm;
-
-				var jsonData = JSON.stringify(params);
-				gagajf.ajaxJsonSubmit('/board/notice/file/delete', jsonData, function() {
-					$(obj).parent().remove();
-				});
-			}
-		});
-	}
-
-	// 첨부파일 개수 선택시
-	$("#fileCnt").on("change", function() {
-		for (var i = 1; i <= 10; i++) {
-			$('#file' + i).parent().parent().show();
-		}
-
-		var fileCnt = $(this).val();
-		for (var i = 10; i > fileCnt; i--) {
-			$('#file' + i).parent().parent().hide();
-		}
-	});
-
-	// 파일첨부 선택 시
-	$('#file1').on('change', function() { fnChooseFile(this, 1); });
-	$('#file2').on('change', function() { fnChooseFile(this, 2); });
-	$('#file3').on('change', function() { fnChooseFile(this, 3); });
-	$('#file4').on('change', function() { fnChooseFile(this, 4); });
-	$('#file5').on('change', function() { fnChooseFile(this, 5); });
-	$('#file6').on('change', function() { fnChooseFile(this, 6); });
-	$('#file7').on('change', function() { fnChooseFile(this, 7); });
-	$('#file8').on('change', function() { fnChooseFile(this, 8); });
-	$('#file9').on('change', function() { fnChooseFile(this, 9); });
-	$('#file10').on('change', function() { fnChooseFile(this, 10); });
-
-	var fnChooseFile = function(obj, fileNo) {
-		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
-		var file = obj.files[0];
-
-		// 파일 업로드
-		gagajf.ajaxFileUpload('/common/file/upload?subDir=/board'
-				, file
-				, function(result) {
-					// 업로드한 파일명 설정
-					$('#orgFileNm' + fileNo).val(result.oldFileName);
-					$('#sysFileNm' + fileNo).val(result.newFileName);
-				}
-		);
-	}
-	
-	// 신규 버튼 클릭
-	$("#btnNew").on("click", function(){
-		$('#detailForm')[0].reset();
-
-		$('#trNew').show();
-		$('#trDetail').hide();
-
-		$('#detailForm input[name=noticeSq]').val('');
-		$('#detailForm input[name=noticeStdt]').val(_today);
-		$('#detailForm input[name=noticeEddt]').val(_today);
-	});
-	
-	// 저장
-	$("#btnSave").on("click", function() {
-		// 날짜 체크
-		if (gagajf.isNull($('#detailForm input[name=noticeSq]').val())) {
-			if (gagajf.isNull($('#detailForm input[name=noticeStdt1]').val())) {
-				mcxDialog.alertC('공지시작일자를 입력해 주세요.', {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$('#detailForm input[name=noticeStdt1]').focus();
-					}
-				});
-				return;
-			}
-
-			if (gagajf.isNull($('#detailForm input[name=noticeEddt1]').val())) {
-				mcxDialog.alertC('공지종료일자를 입력해 주세요.', {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$('#detailForm input[name=noticeEddt1]').focus();
-					}
-				});
-				return;
-			}
-
-			$('#detailForm input[name=noticeStdt]').val($('#detailForm input[name=noticeStdt1]').val());
-			$('#detailForm input[name=noticeEddt]').val($('#detailForm input[name=noticeEddt1]').val());
-		} else {
-			if (gagajf.isNull($('#detailForm input[name=noticeStdt2]').val())) {
-				mcxDialog.alertC('공지시작일자를 입력해 주세요.', {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$('#detailForm input[name=noticeStdt2]').focus();
-					}
-				});
-				return;
-			}
-
-			if (gagajf.isNull($('#detailForm input[name=noticeEddt2]').val())) {
-				mcxDialog.alertC('공지종료일자를 입력해 주세요.', {
-					sureBtnText: "확인",
-					sureBtnClick: function() {
-						$('#detailForm input[name=noticeEddt2]').focus();
-					}
-				});
-				return;
-			}
-
-			$('#detailForm input[name=noticeStdt]').val($('#detailForm input[name=noticeStdt2]').val());
-			$('#detailForm input[name=noticeEddt]').val($('#detailForm input[name=noticeEddt2]').val());
-		}
-
-		var stDate = $('#detailForm input[name=noticeStdt]').val().toDate('YYYY-MM-DD');
-		var edDate = $('#detailForm input[name=noticeEddt]').val().toDate('YYYY-MM-DD');
-
-		if (stDate > edDate) {
-			mcxDialog.alert("공지기간 종료일자는 시작일자 보다 클 수 없습니다.");
-			return;
-		}
-
-		// 수신자 선택
-		if ($('#detailForm input:checkbox[name=receiverIds]').is(":checked") != true) {
-			if (noticeType == 'G047_10') { // 사이트공지
-				mcxDialog.alert("사이트를 선택해 주세요.");
-				return;
-			} else if (noticeType == 'G047_20') { // 내부공지
-				mcxDialog.alert("부서를 선택해 주세요.");
-				return;
-			}
-		}
-
-		// validation
-		if (!gagajf.validation('#detailForm'))
-			return false;
-
-		$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(":checked") ? 'Y' : 'N');
-
-		mcxDialog.confirm('저장하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				var jsonData = JSON.stringify($('#detailForm').serializeObject());
-				gagajf.ajaxJsonSubmit($('#detailForm').prop('action'), jsonData, function() {
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	$(document).ready(function() {
-		cfnCreateCalendar('#noticeTerms', 'startDt', 'endDt');
-		
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-		
-		// Create a summernote
-		let snOptions = gagaSn.getToolbarOptions('media');
-		gagaSn.createSummernote(snOptions, '#noticeContent');
-		
-		$("#fileCnt").trigger('change');
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : NoticeForm.html
+ * @desc    : 공지사항관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.30   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/board/notice/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<input type="hidden" name="noticeType" th:value="${noticeType}"/> <!-- 공지유형(10:사이트공지, 20:내부공지) -->
+				
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col width="10%"/>
+						<col width="23%"/>
+						<col width="10%"/>
+						<col width="23%"/>
+						<col width="10%"/>
+						<col width="24%"/>
+					</colgroup>
+					<tr>
+						<th>등록기간</th>
+						<td colspan="5" id="noticeTerms">
+						</td>
+					</tr>
+					<tr>
+						<th th:text="${noticeType == 'G047_10' ? '사이트' : '부서'}">수신자</th>
+						<td>
+							<select name="receiverId">
+								<option value="">[전체]</option>
+								<option th:if="${noticeReceiverList}" th:each="oneData, status : ${noticeReceiverList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>공지제목</th>
+						<td>
+							<input name="noteicTitle" type="text" maxlength="200"/>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="">[전체]</option>
+								<option value="Y">[Y] Yes</option>
+								<option value="N">[N] No</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" th:action="@{'/board/notice/save'}">
+				<input type="hidden" name="noticeType" th:value="${noticeType}"/> <!-- 공지유형(10:사이트공지, 20:내부공지) -->
+				<input type="hidden" name="noticeStdt"/> <!-- 공지시작일자 -->
+				<input type="hidden" name="noticeEddt"/> <!-- 공지종료일자 -->
+				
+				<table class="frmStyle" aria-describedby="등록/수정 폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+					</colgroup>
+					<tr>
+						<th>공지번호</th>
+						<td>
+							<input type="text" class="w100" name="noticeSq" placeholder="자동부여" readonly="readonly"/>
+						</td>
+						<th>긴급공지여부</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="urgentYn" value="N" checked="checked">일반</label>
+							<label class="rdoBtn"><input type="radio" name="urgentYn" value="Y">긴급</label>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<input type="hidden" name="useYn"/>
+							<label class="chkBox"><input type="checkbox" name="chkUseYn" checked="checked" value="Y"/>사용</label>
+						</td>
+					</tr>
+					<tr id="trNew">
+						<th>공지기간<i class="required" title="필수"></i></th>
+						<td colspan="5">
+							<input type="text" class="schDate w100" name="noticeStdt1" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
+							~
+							<input type="text" class="schDate w100" name="noticeEddt1" maxlength="10" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}"/>
+						</td>
+					</tr>
+					<tr id="trDetail" style="display: none;">
+						<th>공지기간<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="schDate w100" name="noticeStdt2" maxlength="10"/>
+							~
+							<input type="text" class="schDate w100" name="noticeEddt2" maxlength="10"/>
+						</td>
+						<th>조회수</th>
+						<td>
+							<input type="text" class="w100 aR" name="readCnt" readonly="readonly"/>
+						</td>
+						<th>등록자/등록일</th>
+						<td>
+							<input type="text" class="w100" name="regNm" readonly="readonly"/>
+							/
+							<input type="text" class="w100" name="regDt" th:value="${#calendars.format(#calendars.createNow(), 'yyyy-MM-dd')}" readonly="readonly"/>
+						</td>
+					</tr>
+					<tr>
+						<th><span th:text="${noticeType == 'G047_10' ? '사이트' : '부서'}">수신자</span><i class="required" title="필수"></i></th>
+						<td colspan="5">
+							<label class="chkBox" th:if="${noticeReceiverList}" th:each="oneData, status : ${noticeReceiverList}">
+								<input type="checkbox" name="receiverIds" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
+							</label>
+						</td>
+					</tr>
+					<tr>
+						<th>제목<i class="required" title="필수"></i></th>
+						<td colspan="5">
+							<input type="text" name="noticeTitle" required="required" data-valid-name="제목"/>
+						</td>
+					</tr>
+					<tr>
+						<th>공지내용<i class="required" title="필수"></i></th>
+						<td colspan="5">
+							<textarea class="textareaR4" name="noticeContent" id="noticeContent"></textarea>
+						</td>
+					</tr>
+					<tr>
+						<th>파일첨부</th>
+						<td colspan="5">
+							<div id="registeredFile"></div>
+							<div style="display: block">
+								<select name="fileCnt" id="fileCnt">
+									<th:block th:each="num: ${#numbers.sequence(1,10)}">
+										<option th:value="${num}" th:text="${num}"></option>
+									</th:block>
+								</select>* 파일 개수 선택(10개까지 가능)
+							</div>
+							<th:block th:each="num: ${#numbers.sequence(1,10)}">
+								<div>
+									<div class="uFile w500">
+										<input type="file" th:id="${'file' + num}" th:name="${'file' + num}" class="uFileInput w500"/>
+										<label th:for="${'file' + num}" class="uFileLabel">파일선택</label>
+										<input type="hidden" name="orgFileNms" th:id="${'orgFileNm' + num}"/>
+										<input type="hidden" name="sysFileNms" th:id="${'sysFileNm' + num}"/>
+									</div>
+									<br/>
+								</div>
+							</th:block>
+						</td>
+					</tr>
+				</table>
+			</form>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+	</div>
+
+<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020103001"></script>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=2020103001"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 공지사항유형(10:사이트공지, 20:내부공지)
+	let noticeType = [[${noticeType}]];
+
+	let columnDefs = [
+		{headerName: "공지번호", field: "noticeSq", width: 90, cellClass: 'text-center'},
+		{
+			headerName: "긴급공지", field: "urgentYn", width:90, cellClass: 'text-center',
+			cellRenderer: function(params) { return params.value == 'Y' ? '긴급' : '일반'; }
+		},
+// 		{headerName: "사이트", field: "siteNm", width: 200, cellClass: 'text-center'},
+		{
+			headerName: "공지제목", field: "noticeTitle", width: 500,
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{
+			headerName: "파일", field: "fileCnt", width: 50, cellClass: 'text-center',
+			cellRenderer: function(params) { return params.value > 0 ? '<i class="fa fa-folder fa-lg"></i>' : ''; }
+		},
+		{headerName: "공지내용", field: "noticeContent", width: 500, hide: true },
+		{
+			headerName: "공지시작일", field: "noticeStdt", width:120, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		},
+		{
+			headerName: "공지종료일", field: "noticeEddt", width:120, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		},
+		{headerName: "조회수", field: "readCnt", width:90, cellClass: 'text-center'},
+		{headerName: "사용여부", field: "useYn", width:90, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width:90, cellClass: 'text-center'},
+		{
+			headerName: "등록일자", field: "regDt", width:120, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateFormat(params.value); }
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// Cell click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'noticeTitle')
+			return;
+		
+		$('#trNew').hide();
+		$('#trDetail').show();
+
+		$('#detailForm input[name=noticeSq]').val(event.data.noticeSq);
+		$('#detailForm input[name=noticeType]').val(event.data.noticeType);
+
+		if (event.data.urgentYn == 'Y') {
+			$('#detailForm input:radio[name=urgentYn]').eq(1).trigger('click');
+		} else {
+			$('#detailForm input:radio[name=urgentYn]').eq(0).trigger('click');
+		}
+
+		if (event.data.useYn == 'Y') {
+			$('#detailForm input:checkbox[name=chkUseYn]').prop('checked', true);
+		} else {
+			$('#detailForm input:checkbox[name=chkUseYn]').prop('checked', false);
+		}
+		
+		$('#detailForm input[name=noticeStdt2]').val(event.data.noticeStdt.toDate("YYYYMMDD").format("YYYY-MM-DD"));
+		$('#detailForm input[name=noticeEddt2]').val(event.data.noticeEddt.toDate("YYYYMMDD").format("YYYY-MM-DD"));
+		$('#detailForm input[name=readCnt]').val(event.data.readCnt);
+		$('#detailForm input[name=regNm]').val(event.data.regNm);
+		$('#detailForm input[name=regDt]').val(event.data.regDt.toDate("YYYYMMDD").format("YYYY-MM-DD"));
+		$('#detailForm input[name=noticeTitle]').val(event.data.noticeTitle);
+
+		// 공지내용. Summernote에 값 세팅
+		gagaSn.setContents('#noticeContent', event.data.noticeContent);
+
+		// 수신자 목록
+		fnGetNoticeReceiverList(event.data.noticeSq);
+
+		// 파일 목록
+		fnGetNoticeFileList(event.data.noticeSq);
+	}
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 수신자 목록 조회
+	var fnGetNoticeReceiverList = function(noticeSq) {
+		let actionUrl = '/board/notice/receiver/list/' + noticeSq;
+		if (noticeType == 'G047_20') {
+			actionUrl = '/renderer/avail/commonCode/list/G048'; // 부서
+		}
+		
+		$.getJSON(actionUrl
+			, function(result) {
+				// 수신자 체크박스 체크 제거
+				$('#detailForm input:checkbox[name=receiverIds]').prop('checked', false);
+	
+				// 체크박스 개수
+				var chkboxCnt = $('#detailForm input:checkbox[name=receiverIds]').length;
+	
+				// 데이터 개수
+				var dataCnt = result.length;
+	
+				if (dataCnt > 0) {
+					for (var i = 0; i < chkboxCnt; i++) {
+						for (var j = 0; j < dataCnt; j++){
+							var data = result[j].receiverId;
+							if ($('#detailForm input:checkbox[name=receiverIds]').eq(i).val() == data) {
+								$('#detailForm input:checkbox[name=receiverIds]').eq(i).prop('checked', true);
+							}
+						}
+					}
+				}
+			});
+	}
+	
+	// 파일 조회
+	var fnGetNoticeFileList = function(noticeSq) {
+		$.getJSON('/board/notice/file/list/' + noticeSq
+			, function(result) {
+				if (result.length == 0) {
+					$('#registeredFile').html('');
+				} else {
+					$.each(result, function(idx, item) {
+						var tag = '';
+						tag += '<span class="memAdd">';
+						tag += '	<a id="dnFile' + (idx + 1) + '" href="#" onclick="fnDownloadFile(' + (idx + 1) + ', \'' + item.sysFileNm + '\');">' + item.orgFileNm + '</a>\n';
+						tag += '	<button type="button" onclick="fnDeleteFile(this, ' + item.noticeSq + ', ' + item.seq + ', \'' + item.sysFileNm + '\');">삭제</button>\n';
+						tag += '</span>';
+						$('#registeredFile').prepend(tag);
+					});
+				}
+			});
+	}
+	
+	// 파일다운로드
+	var fnDownloadFile = function(idx, fileNm) {
+		$('#dnFile' + idx).attr({
+			href : _uploadDefaultUrl + '/board/' + fileNm,
+			target: '_blank'
+		}).get(0).click();
+	}
+	
+	// 첨부파일 삭제
+	var fnDeleteFile = function(obj, noticeSq, seq, sysFileNm) {
+		mcxDialog.confirm('정말 삭제하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var params = new Object();
+				params.noticeSq = noticeSq;
+				params.seq = seq;
+				params.sysFileNm = sysFileNm;
+
+				var jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/board/notice/file/delete', jsonData, function() {
+					$(obj).parent().remove();
+				});
+			}
+		});
+	}
+
+	// 첨부파일 개수 선택시
+	$("#fileCnt").on("change", function() {
+		for (var i = 1; i <= 10; i++) {
+			$('#file' + i).parent().parent().show();
+		}
+
+		var fileCnt = $(this).val();
+		for (var i = 10; i > fileCnt; i--) {
+			$('#file' + i).parent().parent().hide();
+		}
+	});
+
+	// 파일첨부 선택 시
+	$('#file1').on('change', function() { fnChooseFile(this, 1); });
+	$('#file2').on('change', function() { fnChooseFile(this, 2); });
+	$('#file3').on('change', function() { fnChooseFile(this, 3); });
+	$('#file4').on('change', function() { fnChooseFile(this, 4); });
+	$('#file5').on('change', function() { fnChooseFile(this, 5); });
+	$('#file6').on('change', function() { fnChooseFile(this, 6); });
+	$('#file7').on('change', function() { fnChooseFile(this, 7); });
+	$('#file8').on('change', function() { fnChooseFile(this, 8); });
+	$('#file9').on('change', function() { fnChooseFile(this, 9); });
+	$('#file10').on('change', function() { fnChooseFile(this, 10); });
+
+	var fnChooseFile = function(obj, fileNo) {
+		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
+		var file = obj.files[0];
+
+		// 파일 업로드
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/board'
+				, file
+				, function(result) {
+					// 업로드한 파일명 설정
+					$('#orgFileNm' + fileNo).val(result.oldFileName);
+					$('#sysFileNm' + fileNo).val(result.newFileName);
+				}
+		);
+	}
+	
+	// 신규 버튼 클릭
+	$("#btnNew").on("click", function(){
+		$('#detailForm')[0].reset();
+
+		$('#trNew').show();
+		$('#trDetail').hide();
+
+		$('#detailForm input[name=noticeSq]').val('');
+		$('#detailForm input[name=noticeStdt]').val(_today);
+		$('#detailForm input[name=noticeEddt]').val(_today);
+	});
+	
+	// 저장
+	$("#btnSave").on("click", function() {
+		// 날짜 체크
+		if (gagajf.isNull($('#detailForm input[name=noticeSq]').val())) {
+			if (gagajf.isNull($('#detailForm input[name=noticeStdt1]').val())) {
+				mcxDialog.alertC('공지시작일자를 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm input[name=noticeStdt1]').focus();
+					}
+				});
+				return;
+			}
+
+			if (gagajf.isNull($('#detailForm input[name=noticeEddt1]').val())) {
+				mcxDialog.alertC('공지종료일자를 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm input[name=noticeEddt1]').focus();
+					}
+				});
+				return;
+			}
+
+			$('#detailForm input[name=noticeStdt]').val($('#detailForm input[name=noticeStdt1]').val());
+			$('#detailForm input[name=noticeEddt]').val($('#detailForm input[name=noticeEddt1]').val());
+		} else {
+			if (gagajf.isNull($('#detailForm input[name=noticeStdt2]').val())) {
+				mcxDialog.alertC('공지시작일자를 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm input[name=noticeStdt2]').focus();
+					}
+				});
+				return;
+			}
+
+			if (gagajf.isNull($('#detailForm input[name=noticeEddt2]').val())) {
+				mcxDialog.alertC('공지종료일자를 입력해 주세요.', {
+					sureBtnText: "확인",
+					sureBtnClick: function() {
+						$('#detailForm input[name=noticeEddt2]').focus();
+					}
+				});
+				return;
+			}
+
+			$('#detailForm input[name=noticeStdt]').val($('#detailForm input[name=noticeStdt2]').val());
+			$('#detailForm input[name=noticeEddt]').val($('#detailForm input[name=noticeEddt2]').val());
+		}
+
+		var stDate = $('#detailForm input[name=noticeStdt]').val().toDate('YYYY-MM-DD');
+		var edDate = $('#detailForm input[name=noticeEddt]').val().toDate('YYYY-MM-DD');
+
+		if (stDate > edDate) {
+			mcxDialog.alert("공지기간 종료일자는 시작일자 보다 클 수 없습니다.");
+			return;
+		}
+
+		// 수신자 선택
+		if ($('#detailForm input:checkbox[name=receiverIds]').is(":checked") != true) {
+			if (noticeType == 'G047_10') { // 사이트공지
+				mcxDialog.alert("사이트를 선택해 주세요.");
+				return;
+			} else if (noticeType == 'G047_20') { // 내부공지
+				mcxDialog.alert("부서를 선택해 주세요.");
+				return;
+			}
+		}
+
+		// validation
+		if (!gagajf.validation('#detailForm'))
+			return false;
+
+		$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(":checked") ? 'Y' : 'N');
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify($('#detailForm').serializeObject());
+				gagajf.ajaxJsonSubmit($('#detailForm').prop('action'), jsonData, function() {
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	$(document).ready(function() {
+		cfnCreateCalendar('#noticeTerms', 'startDt', 'endDt');
+		
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		
+		// Create a summernote
+		let snOptions = gagaSn.getToolbarOptions('media');
+		gagaSn.createSummernote(snOptions, '#noticeContent');
+		
+		$("#fileCnt").trigger('change');
+	});
+/*]]>*/
+</script>
+
+</html>

+ 270 - 270
style24.admin/src/main/webapp/WEB-INF/views/business/AflinkForm.html

@@ -1,270 +1,270 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : AflinkForm.html
- * @desc    : 제휴채널관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.20   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/aflink/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>제휴채널</th>
-						<td>
-							<select name="afChannel">
-								<option value="">[전체]</option>
-								<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 다중 TABLE 배치 -->
-			<ul class="division">
-				<li style="width: 60%">
-					<!-- 버튼 배치 영역 -->
-					<ul class="panelBar">
-						<li class="left">
-							<button type="button" class="btn btn-danger btn-lg" id="btnDelete">사용안함</button>
-						</li>
-						<li class="right">
-							<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-						</li>
-					</ul>
-					<!-- //버튼 배치 영역 -->
-					
-					<div id="gridList" style="width: 100%; height: 570px;" class="ag-theme-balham"></div>
-				</li>
-				<li>
-					<!-- 버튼 배치 영역 -->
-					<ul class="panelBar">
-						<li>
-							<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
-							<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-						</li>
-					</ul>
-					<!-- //버튼 배치 영역 -->
-					
-					<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/aflink/save'}">
-						<table class="frmStyle">
-							<colgroup>
-								<col style="width:30%"/>
-								<col/>
-							</colgroup>
-							<tr>
-								<th>제휴코드<i class="star"></i></th>
-								<td>
-									<input type="text" class="w100" name="afLinkCd" placeholder="" maxlength="5" required="required" data-valid-type="alphaNumeric" data-valid-name="제휴코드" onkeyup="$(this).val($(this).val().toUpperCase());"/>
-								</td>
-							</tr>
-							<tr>
-								<th>제휴명<i class="star"></i></th>
-								<td>
-									<input type="text" class="w300" name="afLinkNm" placeholder="" maxlength="100" required="required" data-valid-name="제휴명"/>
-								</td>
-							</tr>
-							<tr>
-								<th>제휴채널<i class="star"></i></th>
-								<td>
-									<select name="afChannel" required="required" data-valid-name="제휴채널">
-										<option value="">[선택]</option>
-										<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-									</select>
-								</td>
-							</tr>
-							<tr>
-								<th>표시순서<i class="star"></i></th>
-								<td>
-									<input type="text" class="w100 text-right" name="dispOrd" placeholder="" maxlength="5" required="required" data-valid-type="numeric" data-valid-name="표시순서" />
-								</td>
-							</tr>
-							<tr>
-								<th>사용여부<i class="star"></i></th>
-								<td>
-									<input type="hidden" name="useYn"/>
-									<label class="chkBox"><input type="checkbox" name="chkUseYn" value="Y" checked="checked" disabled="disabled"/>사용</label>
-								</td>
-							</tr>
-						</table>
-					</form>
-				</li>
-			</ul>
-			<!--//다중 TABLE 배치 -->
-		</div>
-		<!-- //리스트 영역 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let afChannelList = gagajf.convertToArray([[${afChannelList}]]);
-	let useYnList = { "Y":"Yes", "N":"No" };
-
-	let columnDefs = [
-		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{headerName: "제휴링크코드", field: "afLinkCd", width: 100, cellClass: 'text-center'},
-		{
-			headerName: "제휴링크명", field: "afLinkNm", width: 180, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				return '<a href="javascript:void(0);">' + params.value + '</a>';
-			}
-		},
-		{
-			headerName: "제휴채널", field: "afChannel", width: 120, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(afChannelList, params.data.afChannel); }
-		},
-		{headerName: "표시순서", field: "dispOrd", width: 100, cellClass: 'text-center'},
-		{
-			headerName: "사용여부", field: "useYn", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.data.useYn); }
-		}
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// 다중 선택
-	gridOptions.rowSelection = 'multiple';
-	
-	// Cell click
-	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'afLinkNm')
-			return;
-		
-		$('#detailForm input[name=afLinkCd]').val(event.data.afLinkCd);
-		$('#detailForm input[name=afLinkCd]').attr('readonly', true);
-		$('#detailForm input[name=afLinkNm]').val(event.data.afLinkNm);
-		$('#detailForm select[name=afChannel]').val(event.data.afChannel);
-		$('#detailForm select[name=afMedia]').val(event.data.afMedia);
-		$('#detailForm input[name=dispOrd]').val(event.data.dispOrd);
-		
-		$("#detailForm input[name=useYn]").val(event.data.useYn);
-		if (event.data.useYn == 'Y') {
-			$("#detailForm input:checkbox[name=chkUseYn]").attr('checked', true);
-		} else {
-			$("#detailForm input:checkbox[name=chkUseYn]").attr('checked', false);
-		}
-
-		$('#detailForm input[name=afLinkNm]').focus();
-	}
-	
-	// 검색
-	$('#btnSearch').on('click', function() {
-		var actionUrl = $('#searchForm').prop('action') + '?' + $('#searchForm').serialize();
-
-		// Fetch data
-		gagaAgGrid.fetch(actionUrl, gridOptions, '#searchForm');
-	});
-
-	// 신규
-	$('#btnNew').on('click', function() {
-		$('#detailForm')[0].reset();
-		$('#detailForm input[name=afLinkCd]').attr('readonly', false);
-		$('#detailForm input[name=afLinkCd]').removeClass('formControl');
-		$('#detailForm input:checkbox[name=chkUseYn]').attr('disabled', true);
-		$('#detailForm input:checkbox[name=chkUseYn]').addClass('formControl');
-		$('#detailForm input[name=afLinkCd]').focus();
-	});
-	
-	// 사용안함 버튼 클릭 시
-	$('#btnDelete').on('click', function() {
-		var removedData = gagaAgGrid.removeRowData(gridOptions);
-
-		if (removedData.length == 0) {
-			mcxDialog.alert('선택된 행이 없습니다.');
-			return;
-		}
-
-		mcxDialog.confirm('사용안함으로 처리하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값을 변환
-				var updatedData = [];
-
-				$.each(removedData, function(idx, item) {
-					item.useYn = 'N';
-					updatedData.push(item);
-				});
-
-				var jsonData = JSON.stringify(updatedData);
-				gagajf.ajaxJsonSubmit('/business/aflink/list/delete'
-						, jsonData
-						, function() {
-							$('#btnSearch').trigger('click');
-						});
-			}
-		});
-	});
-	
-	// 저장 처리
-	$('#btnSave').on('click', function() {
-		// 입력 값 체크
-		if (!gagajf.validation('#detailForm'))
-			return false;
-
-		$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(":checked") ? 'Y' : 'N');
-
-		mcxDialog.confirm('저장하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				gagajf.ajaxFormSubmit($('#detailForm').prop('action')
-						, $('#detailForm')
-						, function() {
-							$('#btnNew').trigger('click');
-							$('#btnSearch').trigger('click');
-						}
-				);
-			}
-		});
-	});
-	
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('제휴채널 목록', gridOptions);
-	});
-	
-	$(document).ready(function() {
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : AflinkForm.html
+ * @desc    : 제휴채널관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.20   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/aflink/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>제휴채널</th>
+						<td>
+							<select name="afChannel">
+								<option value="">[전체]</option>
+								<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 다중 TABLE 배치 -->
+			<ul class="division">
+				<li style="width: 60%">
+					<!-- 버튼 배치 영역 -->
+					<ul class="panelBar">
+						<li class="left">
+							<button type="button" class="btn btn-danger btn-lg" id="btnDelete">사용안함</button>
+						</li>
+						<li class="right">
+							<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+						</li>
+					</ul>
+					<!-- //버튼 배치 영역 -->
+					
+					<div id="gridList" style="width: 100%; height: 570px;" class="ag-theme-balham"></div>
+				</li>
+				<li>
+					<!-- 버튼 배치 영역 -->
+					<ul class="panelBar">
+						<li>
+							<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+							<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+						</li>
+					</ul>
+					<!-- //버튼 배치 영역 -->
+					
+					<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/aflink/save'}">
+						<table class="frmStyle">
+							<colgroup>
+								<col style="width:30%"/>
+								<col/>
+							</colgroup>
+							<tr>
+								<th>제휴코드<i class="star"></i></th>
+								<td>
+									<input type="text" class="w100" name="afLinkCd" placeholder="" maxlength="5" required="required" data-valid-type="alphaNumeric" data-valid-name="제휴코드" onkeyup="$(this).val($(this).val().toUpperCase());"/>
+								</td>
+							</tr>
+							<tr>
+								<th>제휴명<i class="star"></i></th>
+								<td>
+									<input type="text" class="w300" name="afLinkNm" placeholder="" maxlength="100" required="required" data-valid-name="제휴명"/>
+								</td>
+							</tr>
+							<tr>
+								<th>제휴채널<i class="star"></i></th>
+								<td>
+									<select name="afChannel" required="required" data-valid-name="제휴채널">
+										<option value="">[선택]</option>
+										<option th:if="${afChannelList}" th:each="oneData, status : ${afChannelList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+									</select>
+								</td>
+							</tr>
+							<tr>
+								<th>표시순서<i class="star"></i></th>
+								<td>
+									<input type="text" class="w100 text-right" name="dispOrd" placeholder="" maxlength="5" required="required" data-valid-type="numeric" data-valid-name="표시순서" />
+								</td>
+							</tr>
+							<tr>
+								<th>사용여부<i class="star"></i></th>
+								<td>
+									<input type="hidden" name="useYn"/>
+									<label class="chkBox"><input type="checkbox" name="chkUseYn" value="Y" checked="checked" disabled="disabled"/>사용</label>
+								</td>
+							</tr>
+						</table>
+					</form>
+				</li>
+			</ul>
+			<!--//다중 TABLE 배치 -->
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let afChannelList = gagajf.convertToArray([[${afChannelList}]]);
+	let useYnList = { "Y":"Yes", "N":"No" };
+
+	let columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-right', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "제휴링크코드", field: "afLinkCd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "제휴링크명", field: "afLinkNm", width: 180, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "제휴채널", field: "afChannel", width: 120, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(afChannelList, params.data.afChannel); }
+		},
+		{headerName: "표시순서", field: "dispOrd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "사용여부", field: "useYn", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.data.useYn); }
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 다중 선택
+	gridOptions.rowSelection = 'multiple';
+	
+	// Cell click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'afLinkNm')
+			return;
+		
+		$('#detailForm input[name=afLinkCd]').val(event.data.afLinkCd);
+		$('#detailForm input[name=afLinkCd]').attr('readonly', true);
+		$('#detailForm input[name=afLinkNm]').val(event.data.afLinkNm);
+		$('#detailForm select[name=afChannel]').val(event.data.afChannel);
+		$('#detailForm select[name=afMedia]').val(event.data.afMedia);
+		$('#detailForm input[name=dispOrd]').val(event.data.dispOrd);
+		
+		$("#detailForm input[name=useYn]").val(event.data.useYn);
+		if (event.data.useYn == 'Y') {
+			$("#detailForm input:checkbox[name=chkUseYn]").attr('checked', true);
+		} else {
+			$("#detailForm input:checkbox[name=chkUseYn]").attr('checked', false);
+		}
+
+		$('#detailForm input[name=afLinkNm]').focus();
+	}
+	
+	// 검색
+	$('#btnSearch').on('click', function() {
+		var actionUrl = $('#searchForm').prop('action') + '?' + $('#searchForm').serialize();
+
+		// Fetch data
+		gagaAgGrid.fetch(actionUrl, gridOptions, '#searchForm');
+	});
+
+	// 신규
+	$('#btnNew').on('click', function() {
+		$('#detailForm')[0].reset();
+		$('#detailForm input[name=afLinkCd]').attr('readonly', false);
+		$('#detailForm input[name=afLinkCd]').removeClass('formControl');
+		$('#detailForm input:checkbox[name=chkUseYn]').attr('disabled', true);
+		$('#detailForm input:checkbox[name=chkUseYn]').addClass('formControl');
+		$('#detailForm input[name=afLinkCd]').focus();
+	});
+	
+	// 사용안함 버튼 클릭 시
+	$('#btnDelete').on('click', function() {
+		var removedData = gagaAgGrid.removeRowData(gridOptions);
+
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+
+		mcxDialog.confirm('사용안함으로 처리하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값을 변환
+				var updatedData = [];
+
+				$.each(removedData, function(idx, item) {
+					item.useYn = 'N';
+					updatedData.push(item);
+				});
+
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/business/aflink/list/delete'
+						, jsonData
+						, function() {
+							$('#btnSearch').trigger('click');
+						});
+			}
+		});
+	});
+	
+	// 저장 처리
+	$('#btnSave').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+
+		$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(":checked") ? 'Y' : 'N');
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action')
+						, $('#detailForm')
+						, function() {
+							$('#btnNew').trigger('click');
+							$('#btnSearch').trigger('click');
+						}
+				);
+			}
+		});
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('제휴채널 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 616 - 616
style24.admin/src/main/webapp/WEB-INF/views/business/BrandForm.html

@@ -1,616 +1,616 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : BrandForm.html
- * @desc    : 브랜드관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.11.04   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/brand/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col/>
-						<col style="width:10%;"/>
-						<col style="width:8%;"/>
-					</colgroup>
-					<tr>
-						<th>공급업체</th>
-						<td>
-							<select name="supplyComp">
-								<option value="">[전체]</option>
-								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>유통구분</th>
-						<td>
-							<select name="distributionGb">
-								<option value="">[전체]</option>
-								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>검색어</th>
-						<td>
-							<input type="text" name="searchTxt" placeholder="브랜드코드/브랜드국문명/브랜드영문명/브랜드그룹명" maxlength="20"/>
-						</td>
-						<th>사용여부</th>
-						<td>
-							<select name="useYn">
-								<option value="">[전체]</option>
-								<option value="Y">[Y] Yes</option>
-								<option value="N">[N] No</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
-		</div>
-		<!-- //리스트 영역 -->
-		
-		<!-- 등록/수정 -->
-		<div class="panelStyle">
-			<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/brand/save'}">
-				<input type="hidden" name="mode" value="N"/>
-				
-				<table class="frmStyle" aria-describedby="등록/수정 폼">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:40%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>브랜드코드</th>
-						<td>
-							<select name="brandGb">
-								<option value="S">자사브랜드</option>
-								<option value="E">입점브랜드</option>
-							</select>
-							<input type="text" class="w100" name="brandCd" placeholder="자동생성" maxlength="5" readonly="readonly"/>
-							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 자사브랜드인 경우 먼저 WMS에 등록되어 있는지를 확인해야 합니다.</span>
-						</td>
-						<th>브랜드명<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w200" name="brandEnm" placeholder="브랜드영문명" maxlength="50" required="required" data-valid-name="브랜드영문명"/> / 
-							<input type="text" class="w200" name="brandKnm" placeholder="브랜드국문명" maxlength="50" required="required" data-valid-name="브랜드국문명"/>
-						</td>
-					</tr>
-					<tr>
-						<th>브랜드그룹명<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w200" name="brandGrpNm" maxlength="50" required="required" data-valid-name="브랜드그룹명"/>
-						</td>
-						<th>공급업체<i class="required" title="필수"></i></th>
-						<td>
-							<select name="supplyCompCd" required="required" data-valid-name="공급업체">
-								<option value="">[선택]</option>
-							</select>
-						</td>
-					</tr>
-					<tr>
-						<th>유통구분<i class="required" title="필수"></i></th>
-						<td>
-							<select name="distributionGb" required="required" data-valid-name="유통구분">
-								<option value="">[선택]</option>
-								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>출고처<i class="required" title="필수"></i></th>
-						<td>
-							<select name="delvLocCd">
-								<option value="">[선택]</option>
-							</select>
-						</td>
-					</tr>
-					<tr>
-						<th>기본배송비<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w100 aR" name="delvFee" value="0" maxlength="6" required="required" data-valid-name="기본배송비" data-valid-type="integer"/>원
-							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 변경된 배송비는 이후 등록된 상품부터 적용됩니다.</span>
-						</td>
-						<th>무료배송기준<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w100 aR" name="minOrdAmt" value="0" maxlength="7" required="required" data-valid-name="무료배송기준" data-valid-type="integer"/>원 이상 구매시
-						</td>
-					</tr>
-					<tr>
-						<th>포인트적립율(PC정상)<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w100 aR" name="pntPrate10" maxlength="3" required="required" data-valid-name="포인트적립율(PC정상)" data-valid-type="real"/>%
-						</td>
-						<th>포인트적립율(모바일정상)<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w100 aR" name="pntMrate10" maxlength="3" required="required" data-valid-name="포인트적립율(모바일정상)" data-valid-type="real"/>%
-						</td>
-					</tr>
-					<tr>
-						<th>포인트적립율(PC이월)<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w100 aR" name="pntPrate20" maxlength="3" required="required" data-valid-name="포인트적립율(PC이월)" data-valid-type="real"/>%
-						</td>
-						<th>포인트적립율(모바일이월)<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w100 aR" name="pntMrate20" maxlength="3" required="required" data-valid-name="포인트적립율(모바일이월)" data-valid-type="real"/>%
-						</td>
-					</tr>
-					<tr>
-						<th>판매수수료율<i class="required" title="필수"></i></th>
-						<td colspan="3">
-							<input type="text" class="w100 aR" name="sellFeeRate" value="0" maxlength="3" required="required" data-valid-name="판매수수료율" data-valid-type="real"/>%
-						</td>
-					</tr>
-					<tr id="brandMdArea" class="off">
-						<th>담당MD</th>
-						<td colspan="3" id="tdBrandMd">
-							<div>
-								<input type="text" class="w100" name="mdNm" onkeypress="if( event.keyCode==13 ){$('#mdIdx').val(0); cfnOpenMdListPopup('fnSetMdInfo', $(this).val());}"/>
-								<button type="button" class="btn icn" id="btnSearchBrandMd" onclick="$('#mdIdx').val(0); cfnOpenMdListPopup('fnSetMdInfo');"><i class="fa fa-search"></i></button>
-								<input type="text" class="w100" name="mdNo" readonly="readonly"/>
-								<span class="marL10 cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i> 정상/이월 모두 관리합니다.</span>
-								<button type="button" class="btn btn-base btn-lg" id="btnAddBrandMd">추가</button>
-								<button type="button" class="btn btn-success btn-lg" id="btnUpdateBrandMd">담당MD 수정</button>
-								<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> [담당MD 수정] 버튼을 눌러야 적용됩니다.</span>
-								<input type="hidden" id="mdIdx" />
-							</div>
-						</td>
-					</tr>
-					<tr id="siteArea" class="off">
-						<th>전시사이트</th>
-						<td colspan="3">
-							<label class="chkBox" th:if="${siteList}" th:each="oneData, status : ${siteList}" >
-								<input type="checkbox" name="siteCd" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
-							</label>
-							<button type="button" class="btn btn-success btn-lg" id="btnSiteBrandSave">전시사이트 수정</button>
-						</td>
-					</tr>
-					<tr>
-						<th>노출순서<i class="required" title="필수"></i></th>
-						<td class="infoTxt">
-							<input type="text" class="w100 aR" name="dispOrd" maxlength="5" required="required" data-valid-name="노출순서" data-valid-type="numeric"/>
-						</td>
-						<th>사용여부<i class="required" title="필수"></i></th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes</label>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="N">No</label>
-							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> No에 체크하면 "프론트"에 노출되지 않습니다.</span>
-						</td>
-					</tr>
-				</table>
-			</form>
-			
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
-					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-		</div>
-		<!-- 등록/수정 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
-	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
-	
-	let columnDefs = [
-		{headerName: "브랜드구분", field: "brandGb", width: 80, cellClass: 'text-center', hide: true},
-		{
-			headerName: "브랜드코드", field: "brandCd", width: 100, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				return '<a href="javascript:void(0);">' + params.value + '</a>';
-			}
-		},
-		{headerName: "브랜드영문명", field: "brandEnm", width: 150, cellClass: 'text-center'},
-		{headerName: "브랜드국문명", field: "brandKnm", width: 150, cellClass: 'text-center'},
-		{headerName: "브랜드그룹명", field: "brandGrpNm", width: 150, cellClass: 'text-center'},
-		{
-			headerName: "공급업체", field: "supplyCompCd", width: 150, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
-			}
-		},
-		{
-			headerName: "유통구분", field: "distributionGb", width: 150, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
-			}
-		},
-		{headerName: "출고처코드", field: "delvLocCd", width: 120, cellClass: 'text-center'},
-		{headerName: "출고처명", field: "delvLocNm", width: 150, cellClass: 'text-center'},
-		{headerName: "ERP브랜드코드", field: "erpBrandCd", width: 120, cellClass: 'text-center', hide: true},
-		{
-			headerName: "무료배송비기준",
-			children : [
-				{headerName: "기본배송비", field: "delvFee", width: 120, cellClass: 'text-center', valueFormatter: function(params) { return Number(params.value).addComma(); }},
-				{headerName: "최소주문금액", field: "minOrdAmt", width: 120, cellClass: 'text-center', valueFormatter: function(params) { return Number(params.value).addComma(); }}
-			]
-		},
-		{headerName: "판매수수료율(%)", field: "sellFeeRate", width: 150, cellClass: 'text-center'},
-		{
-			headerName: "포인트적립율(%)",
-			children : [
-				{headerName: "PC정상", field: "pntPrate10", width: 100, cellClass: 'text-center'},
-				{headerName: "모바일정상", field: "pntMrate10", width: 100, cellClass: 'text-center'},
-				{headerName: "PC이월", field: "pntPrate20", width: 100, cellClass: 'text-center'},
-				{headerName: "모바일이월", field: "pntMrate20", width: 100, cellClass: 'text-center'}
-			]
-		},
-		{headerName: "브랜드이미지", field: "brandImg", width: 150, cellClass: 'text-center', hide: true},
-		{headerName: "노출순서", field: "dispOrd", width: 150, cellClass: 'text-center', hide: true},
-		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'}
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// Cell click
-	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'brandCd')
-			return;
-		
-		$("#detailForm input[name=mode]").val("U");
-		$("#detailForm select[name=brandGb]").val(event.data.brandGb);
-		$("#detailForm select[name=brandGb]").attr("disabled", "disabled");
-		$("#detailForm input[name=brandCd]").val(event.data.brandCd);
-		$("#detailForm input[name=brandEnm]").val(event.data.brandEnm);
-		$("#detailForm input[name=brandKnm]").val(event.data.brandKnm);
-		$("#detailForm input[name=brandGrpNm]").val(event.data.brandGrpNm);
-		$("#detailForm input[name=erpBrandCd]").val(event.data.erpBrandCd);
-		$("#detailForm select[name=supplyCompCd]").val(event.data.supplyCompCd);
-		$("#detailForm select[name=distributionGb]").val(event.data.distributionGb);
-		
-		// 출고처 정보
-		$.getJSON('/renderer/delvloc/list/' + event.data.supplyCompCd
-			, function(delvLocList) {
-				$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
-				$.each(delvLocList, function(idx, item) {
-					var optionHtml = '<option value="' + item.cd + '">[' + item.cd + '] '+ item.cdNm + '</option>\n';
-					$('#detailForm select[name=delvLocCd]').append(optionHtml);
-				});
-				
-				$("#detailForm select[name=delvLocCd]").val(event.data.delvLocCd);
-			}
-		);
-		
-		$("#detailForm input[name=delvFee]").val(Number(event.data.delvFee).addComma());
-		$("#detailForm input[name=minOrdAmt]").val(Number(event.data.minOrdAmt).addComma());
-		$("#detailForm input[name=sellFeeRate]").val(event.data.sellFeeRate);
-		$("#detailForm input[name=pntPrate10]").val(event.data.pntPrate10);
-		$("#detailForm input[name=pntMrate10]").val(event.data.pntMrate10);
-		$("#detailForm input[name=pntPrate20]").val(event.data.pntPrate20);
-		$("#detailForm input[name=pntMrate20]").val(event.data.pntMrate20);
-		$("#detailForm input:radio[name=useYn]:input[value=" + event.data.useYn + "]").click();
-		$("#detailForm input[name=dispOrd]").val(event.data.dispOrd);
-		
-		// 담당MD 영역 노출
-		$("#brandMdArea").removeClass("off").addClass("on");
-		fnGetBrandMdList(event.data.brandCd);
-		
-		// 전시사이트 영역 노출
-		$("#siteArea").removeClass("off").addClass("on");
-		fnGetBrandSiteList(event.data.brandCd);
-	}
-
-	// 조회
-	$('#btnSearch').on('click', function() {
-		// Fetch data
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-	
-	// 구매포인트적립율 설정
-	let fnSetPntRate = function(brandGb) {
-		let pntInfo = [[${pntInfo}]];
-		
-		if (brandGb == 'S') { // 자사브랜드
-			$('#detailForm input[name=pntPrate10]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal1);
-			$('#detailForm input[name=pntMrate10]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal2);
-			$('#detailForm input[name=pntPrate20]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal3);
-			$('#detailForm input[name=pntMrate20]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal4);
-		} else { // 입점브랜드
-			$('#detailForm input[name=pntPrate10]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal5);
-			$('#detailForm input[name=pntMrate10]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal6);
-			$('#detailForm input[name=pntPrate20]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal7);
-			$('#detailForm input[name=pntMrate20]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal8);
-		}
-	}
-	
-	// 브랜드구분 변경 시
-	$('#detailForm select[name=brandGb]').on('change', function() {
-		// 구매포인트적립율 설정
-		fnSetPntRate($(this).val());
-		
-		$.getJSON('/renderer/supply/company/list/' + $(this).val()
-			, function(result, status) {
-				$('#detailForm select[name=supplyCompCd]').empty().append('<option value="">[선택]</option>');
-				$.each(result, function(idx, item) {
-					var optionHtml = '<option value="' + item.cd + '">[' + item.cd + '] '+ item.cdNm + '</option>\n';
-					$('#detailForm select[name=supplyCompCd]').append(optionHtml);
-				});
-				$('#detailForm select[name=supplyCompCd]').trigger('change');
-			});
-	});
-	
-	// 공급업체 변경 시
-	$('#detailForm select[name=supplyCompCd]').on('change', function() {
-		if (gagajf.isNull($(this).val())) {
-			$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
-			return;
-		}
-		
-		var data = { supplyCompCd : $(this).val() };
-		var jsonData = JSON.stringify(data);
-		gagajf.ajaxJsonSubmit('/business/supply/company/list', jsonData, function(result) {
-			if (result.length == 0) {
-				$("#detailForm input[name=delvFee]").val(0);
-				$("#detailForm input[name=minOrdAmt]").val(0);
-				$("#detailForm input[name=sellFeeRate]").val(0);
-				return;
-			}
-			
-			$("#detailForm input[name=delvFee]").val(Number(result[0].delvFee).addComma());
-			$("#detailForm input[name=minOrdAmt]").val(Number(result[0].minOrdAmt).addComma());
-			$("#detailForm input[name=sellFeeRate]").val(result[0].sellFeeRate);
-			
-			// 출고처 정보
-			$.getJSON('/renderer/delvloc/list/' + result[0].supplyCompCd
-				, function(delvLocList, status) {
-					$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
-					$.each(delvLocList, function(idx, item) {
-						var optionHtml = '<option value="' + item.cd + '">[' + item.cd + '] '+ item.cdNm + '</option>\n';
-						$('#detailForm select[name=delvLocCd]').append(optionHtml);
-					});
-				}
-			);
-		});
-	});
-	
-	// 브랜드담당MD 목록
-	var fnGetBrandMdList = function(brandCd) {
-		$.getJSON('/business/brand/md/list/' + brandCd
-			, function(result, status) {
-				$("#tdBrandMd input[name=mdNm]").val('');
-				$("#tdBrandMd input[name=mdNo]").val('');
-				
-				$("#tdBrandMd div").each(function(idx) {
-					if (idx > 0) {
-						$(this).remove();
-					}
-				});
-				
-				for (var i = 0; i < result.length; i++) {
-					if (result[i].formalGb == '10') {
-						if (i == 0) {
-							$("#brandMdArea input[name=mdNm]").val(result[i].mdNm);
-							$("#brandMdArea input[name=mdNo]").val(result[i].mdNo);
-						} else {
-							$("#tdBrandMd").append(getBrandMdTag(result[i].mdNo, result[i].mdNm));
-						}
-					}
-				}
-			});
-	}
-
-	// 브랜드 노출사이트 목록
-	var fnGetBrandSiteList = function(brandCd) {
-		$.getJSON('/business/brand/site/list/' + brandCd
-			, function(result) {
-				// 전시사이트 체크박스 체크 제거
-				$('#detailForm input:checkbox[name=siteCd]').prop('checked', false);
-				
-				// 체크박스 개수
-				var chkboxCnt = $('#detailForm input:checkbox[name=siteCd]').length;
-	
-				// 데이터 개수
-				var dataCnt = result.length;
-	
-				if (dataCnt > 0) {
-					for (var i = 0; i < chkboxCnt; i++) {
-						for (var j = 0; j < dataCnt; j++){
-							var data = result[j].siteCd;
-							if ($('#detailForm input:checkbox[name=siteCd]').eq(i).val() == data) {
-								$('#detailForm input:checkbox[name=siteCd]').eq(i).prop('checked', true);
-							}
-						}
-					}
-				}
-		});
-	}
-	
-	var fnSetMdInfo = function(result) {
-		var ind = $('#mdIdx').val();
-		$("#tdBrandMd input[name=mdNo]").eq(ind).val(result.userNo);
-		$("#tdBrandMd input[name=mdNm]").eq(ind).val(result.userNm);
-	}
-	
-	// 브랜드담당MD 수정
-	$("#btnUpdateBrandMd").on("click", function() {
-		var arrData = [];
-		var brandCd = $("#detailForm input[name=brandCd]").val();
-		var mdCnt = 0;
-		
-		$("#tdBrandMd div").each(function() {
-			var mdNo = $(this).find("input[name=mdNo]").val();
-			if (!gagajf.isNull(mdNo)) {
-				mdCnt++;
-			}
-			
-			var data = { brandCd : brandCd, mdNo : mdNo };
-			arrData.push(data);
-		});
-		
-		if (mdCnt == 0) {
-			mcxDialog.alert('담당MD가 선택되지 않았습니다.');
-			return false;
-		}
-		
-		mcxDialog.confirm('담당MD를 수정하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				var jsonData = JSON.stringify(arrData);
-				gagajf.ajaxJsonSubmit('/business/brand/md/save', jsonData);
-			}
-		});
-	});
-	
-	// 전시사이트 수정
-	$("#btnSiteBrandSave").on("click", function() {
-		var arrSiteBrand = [];
-		var brandCd = $("#detailForm input[name=brandCd]").val();
-		var brandGrpNm = $("#detailForm input[name=brandGrpNm]").val();
-		var checkCnt = 0;
-		
-		$("#siteArea label").each(function() {
-			let ele = $(this).find("input:checkbox[name=siteCd]");
-			let siteCd = $(ele).val();
-			let useYn = 'N';
-			
-			if ($(ele).is(':checked')) {
-				useYn = 'Y';
-				checkCnt++;
-			}
-		
-			var data = { brandCd : brandCd, siteCd : siteCd, useYn : useYn, brandGrpNm : brandGrpNm };
-			arrSiteBrand.push(data);
-		});
-		
-		if (checkCnt <= 0) {
-			mcxDialog.alert('전시될 사이트를 선택해 주세요.');
-			return false;
-		}
-		
-		mcxDialog.confirm('전시될 사이트를 수정하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				var jsonData = JSON.stringify(arrSiteBrand);
-				gagajf.ajaxJsonSubmit('/business/brand/site/save', jsonData);
-			}
-		});
-	});
-	
-	// 담당MD 추가 클릭 시
-	$("#btnAddBrandMd").on("click", function() {
-		$("#tdBrandMd").append(getBrandMdTag());
-	});
-	
-	// 담당MD 태그
-	var getBrandMdTag = function(mdNo, mdNm) {
-		var tag = '<div>\n';
-		tag += '	<input type="text" class="w100" name="mdNm" value="' + mdNm + '" onkeypress="if (event.keyCode == 13) { $(\'#mdIdx\').val(' + i + '); cfnOpenMdListPopup(\'fnSetMdInfo\', $(this).val());}"/>\n';
-		tag += '	<button type="button" class="btn icn" id="btnSearchBrandMd" onclick="$(\'#mdIdx\').val(' + i + '); cfnOpenMdListPopup(\'fnSetMdInfo\');"><i class="fa fa-search"></i></button>\n';
-		tag += '	<input type="text" class="w100" name="mdNo" value="' + mdNo + '" readonly="readonly"/>\n';
-		tag += '	<button type="button" class="btn icn" onclick="fnDeleteRow(this);"><i class="fa fa-times" aria-hidden="true"></i></button>\n';
-		tag += '</div>\n';
-		return tag;
-	}
-	
-	// 담당MD 삭제 시
-	var fnDeleteRow = function(obj) {
-		$(obj).closest('div').remove();
-	}
-	
-	var fnSaveCallback = function() {
-		$('#btnSearch').click();
-		$("#btnNew").click();
-	}
-	
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('브랜드 목록', gridOptions);
-	});
-	
-	// 신규 버튼 클릭
-	$("#btnNew").on("click", function() {
-		$("#detailForm")[0].reset();
-		$("#detailForm input[name=mode]").val("N");
-		$("#detailForm select[name=brandGb]").trigger('change');
-		$("#detailForm select[name=brandGb]").removeAttr("disabled");
-		$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
-		
-		// 자사구매포인트적립율 설정
-		fnSetPntRate('Y');
-
-		// 브랜드담당MD 영역은 수정 시 노출
-		$("#brandMdArea").removeClass("on").addClass("off");
-		
-		// 전시사이트 영역은 수정 시 노출
-		$("#siteArea").removeClass("on").addClass("off");
-	});
-
-	// 저장
-	$("#btnSave").on("click", function() {
-		// 입력 값 체크
-		if (!gagajf.validation('#detailForm'))
-			return false;
-		
-		mcxDialog.confirm('저장하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
-					$('#btnNew').trigger('click');
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	$(document).ready(function() {
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-		
-		$('#detailForm select[name=brandGb]').trigger('change');
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : BrandForm.html
+ * @desc    : 브랜드관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.11.04   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/brand/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col/>
+						<col style="width:10%;"/>
+						<col style="width:8%;"/>
+					</colgroup>
+					<tr>
+						<th>공급업체</th>
+						<td>
+							<select name="supplyComp">
+								<option value="">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>유통구분</th>
+						<td>
+							<select name="distributionGb">
+								<option value="">[전체]</option>
+								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>검색어</th>
+						<td>
+							<input type="text" name="searchTxt" placeholder="브랜드코드/브랜드국문명/브랜드영문명/브랜드그룹명" maxlength="20"/>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="">[전체]</option>
+								<option value="Y">[Y] Yes</option>
+								<option value="N">[N] No</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/brand/save'}">
+				<input type="hidden" name="mode" value="N"/>
+				
+				<table class="frmStyle" aria-describedby="등록/수정 폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:40%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>브랜드코드</th>
+						<td>
+							<select name="brandGb">
+								<option value="S">자사브랜드</option>
+								<option value="E">입점브랜드</option>
+							</select>
+							<input type="text" class="w100" name="brandCd" placeholder="자동생성" maxlength="5" readonly="readonly"/>
+							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 자사브랜드인 경우 먼저 WMS에 등록되어 있는지를 확인해야 합니다.</span>
+						</td>
+						<th>브랜드명<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w200" name="brandEnm" placeholder="브랜드영문명" maxlength="50" required="required" data-valid-name="브랜드영문명"/> / 
+							<input type="text" class="w200" name="brandKnm" placeholder="브랜드국문명" maxlength="50" required="required" data-valid-name="브랜드국문명"/>
+						</td>
+					</tr>
+					<tr>
+						<th>브랜드그룹명<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w200" name="brandGrpNm" maxlength="50" required="required" data-valid-name="브랜드그룹명"/>
+						</td>
+						<th>공급업체<i class="required" title="필수"></i></th>
+						<td>
+							<select name="supplyCompCd" required="required" data-valid-name="공급업체">
+								<option value="">[선택]</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>유통구분<i class="required" title="필수"></i></th>
+						<td>
+							<select name="distributionGb" required="required" data-valid-name="유통구분">
+								<option value="">[선택]</option>
+								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>출고처<i class="required" title="필수"></i></th>
+						<td>
+							<select name="delvLocCd">
+								<option value="">[선택]</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>기본배송비<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="delvFee" value="0" maxlength="6" required="required" data-valid-name="기본배송비" data-valid-type="integer"/>원
+							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> 변경된 배송비는 이후 등록된 상품부터 적용됩니다.</span>
+						</td>
+						<th>무료배송기준<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="minOrdAmt" value="0" maxlength="7" required="required" data-valid-name="무료배송기준" data-valid-type="integer"/>원 이상 구매시
+						</td>
+					</tr>
+					<tr>
+						<th>포인트적립율(PC정상)<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="pntPrate10" maxlength="3" required="required" data-valid-name="포인트적립율(PC정상)" data-valid-type="real"/>%
+						</td>
+						<th>포인트적립율(모바일정상)<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="pntMrate10" maxlength="3" required="required" data-valid-name="포인트적립율(모바일정상)" data-valid-type="real"/>%
+						</td>
+					</tr>
+					<tr>
+						<th>포인트적립율(PC이월)<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="pntPrate20" maxlength="3" required="required" data-valid-name="포인트적립율(PC이월)" data-valid-type="real"/>%
+						</td>
+						<th>포인트적립율(모바일이월)<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100 aR" name="pntMrate20" maxlength="3" required="required" data-valid-name="포인트적립율(모바일이월)" data-valid-type="real"/>%
+						</td>
+					</tr>
+					<tr>
+						<th>판매수수료율<i class="required" title="필수"></i></th>
+						<td colspan="3">
+							<input type="text" class="w100 aR" name="sellFeeRate" value="0" maxlength="3" required="required" data-valid-name="판매수수료율" data-valid-type="real"/>%
+						</td>
+					</tr>
+					<tr id="brandMdArea" class="off">
+						<th>담당MD</th>
+						<td colspan="3" id="tdBrandMd">
+							<div>
+								<input type="text" class="w100" name="mdNm" onkeypress="if( event.keyCode==13 ){$('#mdIdx').val(0); cfnOpenMdListPopup('fnSetMdInfo', $(this).val());}"/>
+								<button type="button" class="btn icn" id="btnSearchBrandMd" onclick="$('#mdIdx').val(0); cfnOpenMdListPopup('fnSetMdInfo');"><i class="fa fa-search"></i></button>
+								<input type="text" class="w100" name="mdNo" readonly="readonly"/>
+								<span class="marL10 cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i> 정상/이월 모두 관리합니다.</span>
+								<button type="button" class="btn btn-base btn-lg" id="btnAddBrandMd">추가</button>
+								<button type="button" class="btn btn-success btn-lg" id="btnUpdateBrandMd">담당MD 수정</button>
+								<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> [담당MD 수정] 버튼을 눌러야 적용됩니다.</span>
+								<input type="hidden" id="mdIdx" />
+							</div>
+						</td>
+					</tr>
+					<tr id="siteArea" class="off">
+						<th>전시사이트</th>
+						<td colspan="3">
+							<label class="chkBox" th:if="${siteList}" th:each="oneData, status : ${siteList}" >
+								<input type="checkbox" name="siteCd" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
+							</label>
+							<button type="button" class="btn btn-success btn-lg" id="btnSiteBrandSave">전시사이트 수정</button>
+						</td>
+					</tr>
+					<tr>
+						<th>노출순서<i class="required" title="필수"></i></th>
+						<td class="infoTxt">
+							<input type="text" class="w100 aR" name="dispOrd" maxlength="5" required="required" data-valid-name="노출순서" data-valid-type="numeric"/>
+						</td>
+						<th>사용여부<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes</label>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="N">No</label>
+							<span class="marL10 cRed"><i class="fa fa-info-circle" aria-hidden="true"></i> No에 체크하면 "프론트"에 노출되지 않습니다.</span>
+						</td>
+					</tr>
+				</table>
+			</form>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
+	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
+	
+	let columnDefs = [
+		{headerName: "브랜드구분", field: "brandGb", width: 80, cellClass: 'text-center', hide: true},
+		{
+			headerName: "브랜드코드", field: "brandCd", width: 100, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "브랜드영문명", field: "brandEnm", width: 150, cellClass: 'text-center'},
+		{headerName: "브랜드국문명", field: "brandKnm", width: 150, cellClass: 'text-center'},
+		{headerName: "브랜드그룹명", field: "brandGrpNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "공급업체", field: "supplyCompCd", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
+			}
+		},
+		{
+			headerName: "유통구분", field: "distributionGb", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
+			}
+		},
+		{headerName: "출고처코드", field: "delvLocCd", width: 120, cellClass: 'text-center'},
+		{headerName: "출고처명", field: "delvLocNm", width: 150, cellClass: 'text-center'},
+		{headerName: "ERP브랜드코드", field: "erpBrandCd", width: 120, cellClass: 'text-center', hide: true},
+		{
+			headerName: "무료배송비기준",
+			children : [
+				{headerName: "기본배송비", field: "delvFee", width: 120, cellClass: 'text-center', valueFormatter: function(params) { return Number(params.value).addComma(); }},
+				{headerName: "최소주문금액", field: "minOrdAmt", width: 120, cellClass: 'text-center', valueFormatter: function(params) { return Number(params.value).addComma(); }}
+			]
+		},
+		{headerName: "판매수수료율(%)", field: "sellFeeRate", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "포인트적립율(%)",
+			children : [
+				{headerName: "PC정상", field: "pntPrate10", width: 100, cellClass: 'text-center'},
+				{headerName: "모바일정상", field: "pntMrate10", width: 100, cellClass: 'text-center'},
+				{headerName: "PC이월", field: "pntPrate20", width: 100, cellClass: 'text-center'},
+				{headerName: "모바일이월", field: "pntMrate20", width: 100, cellClass: 'text-center'}
+			]
+		},
+		{headerName: "브랜드이미지", field: "brandImg", width: 150, cellClass: 'text-center', hide: true},
+		{headerName: "노출순서", field: "dispOrd", width: 150, cellClass: 'text-center', hide: true},
+		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// Cell click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'brandCd')
+			return;
+		
+		$("#detailForm input[name=mode]").val("U");
+		$("#detailForm select[name=brandGb]").val(event.data.brandGb);
+		$("#detailForm select[name=brandGb]").attr("disabled", "disabled");
+		$("#detailForm input[name=brandCd]").val(event.data.brandCd);
+		$("#detailForm input[name=brandEnm]").val(event.data.brandEnm);
+		$("#detailForm input[name=brandKnm]").val(event.data.brandKnm);
+		$("#detailForm input[name=brandGrpNm]").val(event.data.brandGrpNm);
+		$("#detailForm input[name=erpBrandCd]").val(event.data.erpBrandCd);
+		$("#detailForm select[name=supplyCompCd]").val(event.data.supplyCompCd);
+		$("#detailForm select[name=distributionGb]").val(event.data.distributionGb);
+		
+		// 출고처 정보
+		$.getJSON('/renderer/delvloc/list/' + event.data.supplyCompCd
+			, function(delvLocList) {
+				$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
+				$.each(delvLocList, function(idx, item) {
+					var optionHtml = '<option value="' + item.cd + '">[' + item.cd + '] '+ item.cdNm + '</option>\n';
+					$('#detailForm select[name=delvLocCd]').append(optionHtml);
+				});
+				
+				$("#detailForm select[name=delvLocCd]").val(event.data.delvLocCd);
+			}
+		);
+		
+		$("#detailForm input[name=delvFee]").val(Number(event.data.delvFee).addComma());
+		$("#detailForm input[name=minOrdAmt]").val(Number(event.data.minOrdAmt).addComma());
+		$("#detailForm input[name=sellFeeRate]").val(event.data.sellFeeRate);
+		$("#detailForm input[name=pntPrate10]").val(event.data.pntPrate10);
+		$("#detailForm input[name=pntMrate10]").val(event.data.pntMrate10);
+		$("#detailForm input[name=pntPrate20]").val(event.data.pntPrate20);
+		$("#detailForm input[name=pntMrate20]").val(event.data.pntMrate20);
+		$("#detailForm input:radio[name=useYn]:input[value=" + event.data.useYn + "]").click();
+		$("#detailForm input[name=dispOrd]").val(event.data.dispOrd);
+		
+		// 담당MD 영역 노출
+		$("#brandMdArea").removeClass("off").addClass("on");
+		fnGetBrandMdList(event.data.brandCd);
+		
+		// 전시사이트 영역 노출
+		$("#siteArea").removeClass("off").addClass("on");
+		fnGetBrandSiteList(event.data.brandCd);
+	}
+
+	// 조회
+	$('#btnSearch').on('click', function() {
+		// Fetch data
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 구매포인트적립율 설정
+	let fnSetPntRate = function(brandGb) {
+		let pntInfo = [[${pntInfo}]];
+		
+		if (brandGb == 'S') { // 자사브랜드
+			$('#detailForm input[name=pntPrate10]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal1);
+			$('#detailForm input[name=pntMrate10]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal2);
+			$('#detailForm input[name=pntPrate20]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal3);
+			$('#detailForm input[name=pntMrate20]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal4);
+		} else { // 입점브랜드
+			$('#detailForm input[name=pntPrate10]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal5);
+			$('#detailForm input[name=pntMrate10]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal6);
+			$('#detailForm input[name=pntPrate20]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal7);
+			$('#detailForm input[name=pntMrate20]').val(gagajf.isNull(pntInfo) ? 0 : pntInfo.strSetVal8);
+		}
+	}
+	
+	// 브랜드구분 변경 시
+	$('#detailForm select[name=brandGb]').on('change', function() {
+		// 구매포인트적립율 설정
+		fnSetPntRate($(this).val());
+		
+		$.getJSON('/renderer/supply/company/list/' + $(this).val()
+			, function(result, status) {
+				$('#detailForm select[name=supplyCompCd]').empty().append('<option value="">[선택]</option>');
+				$.each(result, function(idx, item) {
+					var optionHtml = '<option value="' + item.cd + '">[' + item.cd + '] '+ item.cdNm + '</option>\n';
+					$('#detailForm select[name=supplyCompCd]').append(optionHtml);
+				});
+				$('#detailForm select[name=supplyCompCd]').trigger('change');
+			});
+	});
+	
+	// 공급업체 변경 시
+	$('#detailForm select[name=supplyCompCd]').on('change', function() {
+		if (gagajf.isNull($(this).val())) {
+			$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
+			return;
+		}
+		
+		var data = { supplyCompCd : $(this).val() };
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/business/supply/company/list', jsonData, function(result) {
+			if (result.length == 0) {
+				$("#detailForm input[name=delvFee]").val(0);
+				$("#detailForm input[name=minOrdAmt]").val(0);
+				$("#detailForm input[name=sellFeeRate]").val(0);
+				return;
+			}
+			
+			$("#detailForm input[name=delvFee]").val(Number(result[0].delvFee).addComma());
+			$("#detailForm input[name=minOrdAmt]").val(Number(result[0].minOrdAmt).addComma());
+			$("#detailForm input[name=sellFeeRate]").val(result[0].sellFeeRate);
+			
+			// 출고처 정보
+			$.getJSON('/renderer/delvloc/list/' + result[0].supplyCompCd
+				, function(delvLocList, status) {
+					$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
+					$.each(delvLocList, function(idx, item) {
+						var optionHtml = '<option value="' + item.cd + '">[' + item.cd + '] '+ item.cdNm + '</option>\n';
+						$('#detailForm select[name=delvLocCd]').append(optionHtml);
+					});
+				}
+			);
+		});
+	});
+	
+	// 브랜드담당MD 목록
+	var fnGetBrandMdList = function(brandCd) {
+		$.getJSON('/business/brand/md/list/' + brandCd
+			, function(result, status) {
+				$("#tdBrandMd input[name=mdNm]").val('');
+				$("#tdBrandMd input[name=mdNo]").val('');
+				
+				$("#tdBrandMd div").each(function(idx) {
+					if (idx > 0) {
+						$(this).remove();
+					}
+				});
+				
+				for (var i = 0; i < result.length; i++) {
+					if (result[i].formalGb == '10') {
+						if (i == 0) {
+							$("#brandMdArea input[name=mdNm]").val(result[i].mdNm);
+							$("#brandMdArea input[name=mdNo]").val(result[i].mdNo);
+						} else {
+							$("#tdBrandMd").append(getBrandMdTag(result[i].mdNo, result[i].mdNm));
+						}
+					}
+				}
+			});
+	}
+
+	// 브랜드 노출사이트 목록
+	var fnGetBrandSiteList = function(brandCd) {
+		$.getJSON('/business/brand/site/list/' + brandCd
+			, function(result) {
+				// 전시사이트 체크박스 체크 제거
+				$('#detailForm input:checkbox[name=siteCd]').prop('checked', false);
+				
+				// 체크박스 개수
+				var chkboxCnt = $('#detailForm input:checkbox[name=siteCd]').length;
+	
+				// 데이터 개수
+				var dataCnt = result.length;
+	
+				if (dataCnt > 0) {
+					for (var i = 0; i < chkboxCnt; i++) {
+						for (var j = 0; j < dataCnt; j++){
+							var data = result[j].siteCd;
+							if ($('#detailForm input:checkbox[name=siteCd]').eq(i).val() == data) {
+								$('#detailForm input:checkbox[name=siteCd]').eq(i).prop('checked', true);
+							}
+						}
+					}
+				}
+		});
+	}
+	
+	var fnSetMdInfo = function(result) {
+		var ind = $('#mdIdx').val();
+		$("#tdBrandMd input[name=mdNo]").eq(ind).val(result.userNo);
+		$("#tdBrandMd input[name=mdNm]").eq(ind).val(result.userNm);
+	}
+	
+	// 브랜드담당MD 수정
+	$("#btnUpdateBrandMd").on("click", function() {
+		var arrData = [];
+		var brandCd = $("#detailForm input[name=brandCd]").val();
+		var mdCnt = 0;
+		
+		$("#tdBrandMd div").each(function() {
+			var mdNo = $(this).find("input[name=mdNo]").val();
+			if (!gagajf.isNull(mdNo)) {
+				mdCnt++;
+			}
+			
+			var data = { brandCd : brandCd, mdNo : mdNo };
+			arrData.push(data);
+		});
+		
+		if (mdCnt == 0) {
+			mcxDialog.alert('담당MD가 선택되지 않았습니다.');
+			return false;
+		}
+		
+		mcxDialog.confirm('담당MD를 수정하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(arrData);
+				gagajf.ajaxJsonSubmit('/business/brand/md/save', jsonData);
+			}
+		});
+	});
+	
+	// 전시사이트 수정
+	$("#btnSiteBrandSave").on("click", function() {
+		var arrSiteBrand = [];
+		var brandCd = $("#detailForm input[name=brandCd]").val();
+		var brandGrpNm = $("#detailForm input[name=brandGrpNm]").val();
+		var checkCnt = 0;
+		
+		$("#siteArea label").each(function() {
+			let ele = $(this).find("input:checkbox[name=siteCd]");
+			let siteCd = $(ele).val();
+			let useYn = 'N';
+			
+			if ($(ele).is(':checked')) {
+				useYn = 'Y';
+				checkCnt++;
+			}
+		
+			var data = { brandCd : brandCd, siteCd : siteCd, useYn : useYn, brandGrpNm : brandGrpNm };
+			arrSiteBrand.push(data);
+		});
+		
+		if (checkCnt <= 0) {
+			mcxDialog.alert('전시될 사이트를 선택해 주세요.');
+			return false;
+		}
+		
+		mcxDialog.confirm('전시될 사이트를 수정하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(arrSiteBrand);
+				gagajf.ajaxJsonSubmit('/business/brand/site/save', jsonData);
+			}
+		});
+	});
+	
+	// 담당MD 추가 클릭 시
+	$("#btnAddBrandMd").on("click", function() {
+		$("#tdBrandMd").append(getBrandMdTag());
+	});
+	
+	// 담당MD 태그
+	var getBrandMdTag = function(mdNo, mdNm) {
+		var tag = '<div>\n';
+		tag += '	<input type="text" class="w100" name="mdNm" value="' + mdNm + '" onkeypress="if (event.keyCode == 13) { $(\'#mdIdx\').val(' + i + '); cfnOpenMdListPopup(\'fnSetMdInfo\', $(this).val());}"/>\n';
+		tag += '	<button type="button" class="btn icn" id="btnSearchBrandMd" onclick="$(\'#mdIdx\').val(' + i + '); cfnOpenMdListPopup(\'fnSetMdInfo\');"><i class="fa fa-search"></i></button>\n';
+		tag += '	<input type="text" class="w100" name="mdNo" value="' + mdNo + '" readonly="readonly"/>\n';
+		tag += '	<button type="button" class="btn icn" onclick="fnDeleteRow(this);"><i class="fa fa-times" aria-hidden="true"></i></button>\n';
+		tag += '</div>\n';
+		return tag;
+	}
+	
+	// 담당MD 삭제 시
+	var fnDeleteRow = function(obj) {
+		$(obj).closest('div').remove();
+	}
+	
+	var fnSaveCallback = function() {
+		$('#btnSearch').click();
+		$("#btnNew").click();
+	}
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('브랜드 목록', gridOptions);
+	});
+	
+	// 신규 버튼 클릭
+	$("#btnNew").on("click", function() {
+		$("#detailForm")[0].reset();
+		$("#detailForm input[name=mode]").val("N");
+		$("#detailForm select[name=brandGb]").trigger('change');
+		$("#detailForm select[name=brandGb]").removeAttr("disabled");
+		$('#detailForm select[name=delvLocCd]').empty().append('<option value="">[선택]</option>');
+		
+		// 자사구매포인트적립율 설정
+		fnSetPntRate('Y');
+
+		// 브랜드담당MD 영역은 수정 시 노출
+		$("#brandMdArea").removeClass("on").addClass("off");
+		
+		// 전시사이트 영역은 수정 시 노출
+		$("#siteArea").removeClass("on").addClass("off");
+	});
+
+	// 저장
+	$("#btnSave").on("click", function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+		
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
+					$('#btnNew').trigger('click');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		
+		$('#detailForm select[name=brandGb]').trigger('change');
+	});
+/*]]>*/
+</script>
+
+</html>

+ 382 - 382
style24.admin/src/main/webapp/WEB-INF/views/business/DeliveryLocForm.html

@@ -1,382 +1,382 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : DeliveryLocForm.html
- * @desc    : 출고처관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.14   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/supply/company/delvloc/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>공급업체</th>
-						<td>
-							<select name="supplyCompCd">
-								<option value="">[전체]</option>
-								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>출고처유형</th>
-						<td>
-							<select name="delvLocClsf">
-								<option value="">[전체]</option>
-								<option th:if="${delvLocClsfList}" th:each="oneData, status : ${delvLocClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>출고처명</th>
-						<td>
-							<input type="text" name="delvLocNm" maxlength="50"/>
-						</td>
-						<th>사용여부</th>
-						<td>
-							<select name="useYn">
-								<option value="Y">Yes</option>
-								<option value="N">No</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
-		</div>
-		<!-- //리스트 영역 -->
-		
-		<!-- 등록/수정 -->
-		<div class="panelStyle">
-			<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/supply/company/delvloc/save'}">
-				<table class="frmStyle" aria-describedby="등록/수정 폼">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-					</colgroup>
-					<tr>
-						<th>출고처코드<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w100" name="delvLocCd" maxlength="20" placeholder="출고처코드" required="required" data-valid-type="alphaNumeric" data-valid-name="출고처코드"/>
-						</td>
-						<th>출고처명<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" class="w200" name="delvLocNm" maxlength="100" placeholder="출고처명" required="required" data-valid-name="출고처명"/>
-						</td>
-						<th>출고처유형<i class="required" title="필수"></i></th>
-						<td>
-							<select name="delvLocClsf" required="required" data-valid-name="출고처유형">
-								<option value="">[선택]</option>
-								<option th:if="${delvLocClsfList}" th:each="oneData, status : ${delvLocClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>공급업체<i class="required" title="필수"></i></th>
-						<td>
-							<select name="supplyCompCd" required="required" data-valid-name="공급업체">
-								<option value="">[선택]</option>
-								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-					</tr>
-					<tr>
-						<th>재고적용율</th>
-						<td colspan="3">
-							<input type="text" class="w100 aR" name="stockApplRate" maxlength="5" data-valid-type="real"/>%
-							<span class="cBlue">* WMS부터 수신된 재고의 판매가용재고 적용율(%). 물류창고와 직송매장에 한함</span>
-						</td>
-						<th>출고수수료율</th>
-						<td colspan="3">
-							<input type="text" class="w100 aR" name="delvFeeRate" maxlength="5" data-valid-type="real"/>%
-							<span class="cBlue">* 직송매장 출고 시 적용할 출고수수료율(%)</span>
-						</td>
-					</tr>
-					<tr>
-						<th>출고지정순서</th>
-						<td colspan="3">
-							<input type="text" class="w100 aR" name="delvAssignOrd" maxlength="3" data-valid-type="integer"/>
-							<span class="cBlue">* 물류창고와 직송매장에 대해 출고지정되는 순서</span>
-						</td>
-<!-- 						<th>출고지정등급</th> -->
-<!-- 						<td> -->
-<!-- 							<select name="delvAssignGrade"> -->
-<!-- 								<option value="">[선택]</option> -->
-<!-- 								<option value="A">[A] A등급</option> -->
-<!-- 								<option value="B">[B] B등급</option> -->
-<!-- 								<option value="C">[C] C등급</option> -->
-<!-- 								<option value="Z">[Z] 출고지정제외</option> -->
-<!-- 							</select> -->
-<!-- 						</td> -->
-						<th>사용여부<i class="required" title="필수"></i></th>
-						<td colspan="3">
-							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes<span></span></label>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="N">No<span></span></label>
-						</td>
-					</tr>
-					<tr>
-						<th>출고처주소<i class="required" title="필수"></i></th>
-						<td colspan="7">
-							<input type="text" class="w100" name="delvLocZipcode" data-valid-name="출고처 우편번호" readonly="readonly"/>
-							<button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
-							<input type="text" class="w300" name="delvLocBaseAddr" required="required" data-valid-name="출고처 기본주소" readonly="readonly"/>
-							-
-							<input type="text" class="w300" name="delvLocDtlAddr" maxlength="100" data-valid-name="출고처 상세주소"/>
-						</td>
-					</tr>
-					<tr>
-						<th>반품처명</th>
-						<td>
-							<input type="text" class="w200" name="rtnLocNm" maxlength="100" placeholder="반품처명"/>
-						</td>
-						<th>반품처주소<i class="required" title="필수"></i></th>
-						<td colspan="5">
-							<input type="text" class="w100" name="rtnLocZipcode" data-valid-name="반품처 우편번호" readonly="readonly"/>
-							<button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr('rtnLoc');">우편번호찾기</button>
-							<input type="text" class="w300" name="rtnLocBaseAddr" required="required" data-valid-name="반품처 기본주소" readonly="readonly"/>
-							-
-							<input type="text" class="w300" name="rtnLocDtlAddr" maxlength="100" data-valid-name="반품처 상세주소"/>
-						</td>
-					</tr>
-				</table>
-			</form>
-			
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
-					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-		</div>
-		<!-- 등록/수정 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
-	let delvLocClsfList = gagajf.convertToArray([[${delvLocClsfList}]]);
-	let delvGradeList = { "A":"A등급", "B":"B등급", "C":"C등급", "Z":"출고지정제외" };
-	let invoicePrintTypeList = gagajf.convertToArray([[${invoicePrintTypeList}]]);
-
-	let columnDefs = [
-		{ headerName: "출고처코드", field: "delvLocCd", width: 100, cellClass: 'text-center' },
-		{
-			headerName: "출고처명", field: "delvLocNm", width: 150, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				return '<a href="javascript:void(0);">' + params.value + '</a>';
-			}
-		},
-		{
-			headerName: "출고처유형", field: "delvLocClsf", width: 150, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(delvLocClsfList, params.data.delvLocClsf);
-			}
-		},
-		{
-			headerName: "매장POS", field: "btnPos", width: 120, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				var btn = '';
-				if (params.value === '21') {
-					btn ='<button type="button" class="btn btn-success btn-sm" onclick="cfnPopPos(\'' + params.data.delvLocCd + '\');\">매장[POS]</button>';
-				}
-				return btn;
-			}
-		},
-		{
-			headerName: "공급업체", field: "supplyCompCd", width: 150, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
-			}
-		},
-		{ headerName: "재고적용율(%)", field: "stockApplRate", width: 120, cellClass: 'text-center' },
-		{ headerName: "출고수수료율(%)", field: "delvFeeRate", width:120, cellClass: 'text-center' },
-		{ headerName: "출고지정순서", field: "delvAssignOrd", width: 120, cellClass: 'text-center' },
-// 		{
-// 			headerName: "출고지정등급", field: "delvAssignGrade", width: 150, cellClass: 'text-center',
-// 			cellRenderer: function (params) {
-// 				return gagaAgGrid.lookupValue(delvGradeList, params.value);
-// 			}
-// 		},
-		{
-			headerName: "송장출력형태", field: "invoicePrintType", width:150 , cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(invoicePrintTypeList, params.data.invoicePrintType);
-			}
-		},
-		{ headerName: "출고처우편번호", field: "delvLocZipcode", width: 150, cellClass: 'text-center', hide: true },
-		{ headerName: "출고처기본주소", field: "delvLocBaseAddr", width: 300, hide: true },
-		{ headerName: "출고처상세주소", field: "delvLocDtlAddr", width: 300, hide: true },
-		{ headerName: "반품처명", field: "rtnLocNm", width: 100, cellClass: 'text-center', hide: true },
-		{ headerName: "반품처우편번호", field: "rtnLocZipcode", width: 150, cellClass: 'text-center', hide: true },
-		{ headerName: "반품처기본주소", field: "rtnLocBaseAddr", width: 300, hide: true },
-		{ headerName: "반품처상세주소", field: "rtnLocDtlAddr", width: 300, hide: true },
-		{
-			headerName: "사용여부", field: "useYn", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) { return params.data.useYn == 'Y' ? 'Yes' : 'No'; }
-		}
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// Cell click
-	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'delvLocNm')
-			return;
-		
-		$('#detailForm input[name=delvLocCd]').attr('readonly', true);
-		$('#detailForm input[name=delvLocCd]').val(event.data.delvLocCd);
-		$('#detailForm input[name=delvLocNm]').val(event.data.delvLocNm);
-		$('#detailForm select[name=delvLocClsf]').val(event.data.delvLocClsf);
-		$('#detailForm select[name=supplyCompCd]').val(event.data.supplyCompCd);
-		$('#detailForm input[name=delvAssignOrd]').val(event.data.delvAssignOrd);
-		$('#detailForm select[name=delvAssignGrade]').val(event.data.delvAssignGrade);
-		$('#detailForm input[name=stockApplRate]').val(Number(event.data.stockApplRate).addComma());
-		$('#detailForm input[name=delvFeeRate]').val(Number(event.data.delvFeeRate).addComma());
-		$('#detailForm select[name=invoicePrintType]').val(event.data.invoicePrintType	);
-		$('#detailForm input[name=delvLocZipcode]').val(event.data.delvLocZipcode);
-		$('#detailForm input[name=delvLocBaseAddr]').val(event.data.delvLocBaseAddr);
-		$('#detailForm input[name=delvLocDtlAddr]').val(event.data.delvLocDtlAddr);
-		$('#detailForm input[name=rtnLocZipcode]').val(event.data.rtnLocZipcode);
-		$('#detailForm input[name=rtnLocBaseAddr]').val(event.data.rtnLocBaseAddr);
-		$('#detailForm input[name=rtnLocDtlAddr]').val(event.data.rtnLocDtlAddr);
-		$('#detailForm input[name=rtnLocNm]').val(event.data.rtnLocNm);
-		
-		if (event.data.useYn == 'Y') {
-			$('#detailForm input:radio[name=useYn]').eq(0).attr('checked', true);
-		} else {
-			$('#detailForm input:radio[name=useYn]').eq(1).attr('checked', true);
-		}
-	}
-
-	// 출고처유형 셀렉트박스 변경 시 이벤트
-	$('#detailForm select[name=delvLocClsf]').on('change', function() {
-		let val = $(this).val();
-		
-		if (val == 'G024_10' || val == 'G024_21') { // 물류창고, 직송매장
-			$('#detailForm input[name=stockApplRate]').val(100);
-		} else {
-			$('#detailForm input[name=stockApplRate]').val('');
-		}
-	});
-	
-	// 검색
-	$('#btnSearch').on('click', function() {
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-
-	// 신규버튼
-	$('#btnNew').on('click', function() {
-		$("#detailForm")[0].reset();
-		$('#detailForm input[name=delvLocCd]').attr('readonly', false);
-		$('#detailForm input[name=delvLocCd]').focus();
-	});
-	
-	// 저장
-	$("#btnSave").on("click", function() {
-		// 필수값 체크
-		if (!gagajf.validation('#detailForm'))
-			return false;
-
-		mcxDialog.confirm("저장하시겠습니까?", {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
-					$('#btnNew').trigger('click');
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('출고처 목록', gridOptions);
-	});
-	
-	/**
-	 * DAUM을 이용한 우편번호 팝업 레이어
-	 * @param callbackPosition - 우편번호 정보를 설정할 위치
-	 */
-	var fnOpenDaumAddr = function(callbackPosition) {
-		let daumZip = new daum.Postcode({
-			oncomplete: function(data) {
-				// 우편번호와 주소 정보를 해당 필드에 넣는다.
-				if (callbackPosition == 'delvLoc') {
-					$('#detailForm input[name=delvLocZipcode]').val(data.zonecode);
-					$('#detailForm input[name=delvLocBaseAddr]').val(cfnGetDaumRoadAddr(data));
-					$('#detailForm input[name=delvLocDtlAddr]').focus();
-				} else if (callbackPosition == 'rtnLoc') {
-					$('#detailForm input[name=rtnLocZipcode]').val(data.zonecode);
-					$('#detailForm input[name=rtnLocBaseAddr]').val(cfnGetDaumRoadAddr(data));
-					$('#detailForm input[name=rtnLocDtlAddr]').focus();
-				}
-				
-				cfnCloseDaumAddr();
-			},
-			width: '100%'
-		});
-		
-		cfnOpenDaumAddr(daumZip);
-	}
-	
-	$(document).ready(function() {
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : DeliveryLocForm.html
+ * @desc    : 출고처관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.14   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/supply/company/delvloc/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>공급업체</th>
+						<td>
+							<select name="supplyCompCd">
+								<option value="">[전체]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>출고처유형</th>
+						<td>
+							<select name="delvLocClsf">
+								<option value="">[전체]</option>
+								<option th:if="${delvLocClsfList}" th:each="oneData, status : ${delvLocClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>출고처명</th>
+						<td>
+							<input type="text" name="delvLocNm" maxlength="50"/>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="Y">Yes</option>
+								<option value="N">No</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/supply/company/delvloc/save'}">
+				<table class="frmStyle" aria-describedby="등록/수정 폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+					</colgroup>
+					<tr>
+						<th>출고처코드<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w100" name="delvLocCd" maxlength="20" placeholder="출고처코드" required="required" data-valid-type="alphaNumeric" data-valid-name="출고처코드"/>
+						</td>
+						<th>출고처명<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" class="w200" name="delvLocNm" maxlength="100" placeholder="출고처명" required="required" data-valid-name="출고처명"/>
+						</td>
+						<th>출고처유형<i class="required" title="필수"></i></th>
+						<td>
+							<select name="delvLocClsf" required="required" data-valid-name="출고처유형">
+								<option value="">[선택]</option>
+								<option th:if="${delvLocClsfList}" th:each="oneData, status : ${delvLocClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>공급업체<i class="required" title="필수"></i></th>
+						<td>
+							<select name="supplyCompCd" required="required" data-valid-name="공급업체">
+								<option value="">[선택]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>재고적용율</th>
+						<td colspan="3">
+							<input type="text" class="w100 aR" name="stockApplRate" maxlength="5" data-valid-type="real"/>%
+							<span class="cBlue">* WMS부터 수신된 재고의 판매가용재고 적용율(%). 물류창고와 직송매장에 한함</span>
+						</td>
+						<th>출고수수료율</th>
+						<td colspan="3">
+							<input type="text" class="w100 aR" name="delvFeeRate" maxlength="5" data-valid-type="real"/>%
+							<span class="cBlue">* 직송매장 출고 시 적용할 출고수수료율(%)</span>
+						</td>
+					</tr>
+					<tr>
+						<th>출고지정순서</th>
+						<td colspan="3">
+							<input type="text" class="w100 aR" name="delvAssignOrd" maxlength="3" data-valid-type="integer"/>
+							<span class="cBlue">* 물류창고와 직송매장에 대해 출고지정되는 순서</span>
+						</td>
+<!-- 						<th>출고지정등급</th> -->
+<!-- 						<td> -->
+<!-- 							<select name="delvAssignGrade"> -->
+<!-- 								<option value="">[선택]</option> -->
+<!-- 								<option value="A">[A] A등급</option> -->
+<!-- 								<option value="B">[B] B등급</option> -->
+<!-- 								<option value="C">[C] C등급</option> -->
+<!-- 								<option value="Z">[Z] 출고지정제외</option> -->
+<!-- 							</select> -->
+<!-- 						</td> -->
+						<th>사용여부<i class="required" title="필수"></i></th>
+						<td colspan="3">
+							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked">Yes<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="N">No<span></span></label>
+						</td>
+					</tr>
+					<tr>
+						<th>출고처주소<i class="required" title="필수"></i></th>
+						<td colspan="7">
+							<input type="text" class="w100" name="delvLocZipcode" data-valid-name="출고처 우편번호" readonly="readonly"/>
+							<button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr('delvLoc');">우편번호찾기</button>
+							<input type="text" class="w300" name="delvLocBaseAddr" required="required" data-valid-name="출고처 기본주소" readonly="readonly"/>
+							-
+							<input type="text" class="w300" name="delvLocDtlAddr" maxlength="100" data-valid-name="출고처 상세주소"/>
+						</td>
+					</tr>
+					<tr>
+						<th>반품처명</th>
+						<td>
+							<input type="text" class="w200" name="rtnLocNm" maxlength="100" placeholder="반품처명"/>
+						</td>
+						<th>반품처주소<i class="required" title="필수"></i></th>
+						<td colspan="5">
+							<input type="text" class="w100" name="rtnLocZipcode" data-valid-name="반품처 우편번호" readonly="readonly"/>
+							<button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr('rtnLoc');">우편번호찾기</button>
+							<input type="text" class="w300" name="rtnLocBaseAddr" required="required" data-valid-name="반품처 기본주소" readonly="readonly"/>
+							-
+							<input type="text" class="w300" name="rtnLocDtlAddr" maxlength="100" data-valid-name="반품처 상세주소"/>
+						</td>
+					</tr>
+				</table>
+			</form>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
+	let delvLocClsfList = gagajf.convertToArray([[${delvLocClsfList}]]);
+	let delvGradeList = { "A":"A등급", "B":"B등급", "C":"C등급", "Z":"출고지정제외" };
+	let invoicePrintTypeList = gagajf.convertToArray([[${invoicePrintTypeList}]]);
+
+	let columnDefs = [
+		{ headerName: "출고처코드", field: "delvLocCd", width: 100, cellClass: 'text-center' },
+		{
+			headerName: "출고처명", field: "delvLocNm", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "출고처유형", field: "delvLocClsf", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(delvLocClsfList, params.data.delvLocClsf);
+			}
+		},
+		{
+			headerName: "매장POS", field: "btnPos", width: 120, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				var btn = '';
+				if (params.value === '21') {
+					btn ='<button type="button" class="btn btn-success btn-sm" onclick="cfnPopPos(\'' + params.data.delvLocCd + '\');\">매장[POS]</button>';
+				}
+				return btn;
+			}
+		},
+		{
+			headerName: "공급업체", field: "supplyCompCd", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(supplyCompList, params.data.supplyCompCd);
+			}
+		},
+		{ headerName: "재고적용율(%)", field: "stockApplRate", width: 120, cellClass: 'text-center' },
+		{ headerName: "출고수수료율(%)", field: "delvFeeRate", width:120, cellClass: 'text-center' },
+		{ headerName: "출고지정순서", field: "delvAssignOrd", width: 120, cellClass: 'text-center' },
+// 		{
+// 			headerName: "출고지정등급", field: "delvAssignGrade", width: 150, cellClass: 'text-center',
+// 			cellRenderer: function (params) {
+// 				return gagaAgGrid.lookupValue(delvGradeList, params.value);
+// 			}
+// 		},
+		{
+			headerName: "송장출력형태", field: "invoicePrintType", width:150 , cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(invoicePrintTypeList, params.data.invoicePrintType);
+			}
+		},
+		{ headerName: "출고처우편번호", field: "delvLocZipcode", width: 150, cellClass: 'text-center', hide: true },
+		{ headerName: "출고처기본주소", field: "delvLocBaseAddr", width: 300, hide: true },
+		{ headerName: "출고처상세주소", field: "delvLocDtlAddr", width: 300, hide: true },
+		{ headerName: "반품처명", field: "rtnLocNm", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "반품처우편번호", field: "rtnLocZipcode", width: 150, cellClass: 'text-center', hide: true },
+		{ headerName: "반품처기본주소", field: "rtnLocBaseAddr", width: 300, hide: true },
+		{ headerName: "반품처상세주소", field: "rtnLocDtlAddr", width: 300, hide: true },
+		{
+			headerName: "사용여부", field: "useYn", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.useYn == 'Y' ? 'Yes' : 'No'; }
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// Cell click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'delvLocNm')
+			return;
+		
+		$('#detailForm input[name=delvLocCd]').attr('readonly', true);
+		$('#detailForm input[name=delvLocCd]').val(event.data.delvLocCd);
+		$('#detailForm input[name=delvLocNm]').val(event.data.delvLocNm);
+		$('#detailForm select[name=delvLocClsf]').val(event.data.delvLocClsf);
+		$('#detailForm select[name=supplyCompCd]').val(event.data.supplyCompCd);
+		$('#detailForm input[name=delvAssignOrd]').val(event.data.delvAssignOrd);
+		$('#detailForm select[name=delvAssignGrade]').val(event.data.delvAssignGrade);
+		$('#detailForm input[name=stockApplRate]').val(Number(event.data.stockApplRate).addComma());
+		$('#detailForm input[name=delvFeeRate]').val(Number(event.data.delvFeeRate).addComma());
+		$('#detailForm select[name=invoicePrintType]').val(event.data.invoicePrintType	);
+		$('#detailForm input[name=delvLocZipcode]').val(event.data.delvLocZipcode);
+		$('#detailForm input[name=delvLocBaseAddr]').val(event.data.delvLocBaseAddr);
+		$('#detailForm input[name=delvLocDtlAddr]').val(event.data.delvLocDtlAddr);
+		$('#detailForm input[name=rtnLocZipcode]').val(event.data.rtnLocZipcode);
+		$('#detailForm input[name=rtnLocBaseAddr]').val(event.data.rtnLocBaseAddr);
+		$('#detailForm input[name=rtnLocDtlAddr]').val(event.data.rtnLocDtlAddr);
+		$('#detailForm input[name=rtnLocNm]').val(event.data.rtnLocNm);
+		
+		if (event.data.useYn == 'Y') {
+			$('#detailForm input:radio[name=useYn]').eq(0).attr('checked', true);
+		} else {
+			$('#detailForm input:radio[name=useYn]').eq(1).attr('checked', true);
+		}
+	}
+
+	// 출고처유형 셀렉트박스 변경 시 이벤트
+	$('#detailForm select[name=delvLocClsf]').on('change', function() {
+		let val = $(this).val();
+		
+		if (val == 'G024_10' || val == 'G024_21') { // 물류창고, 직송매장
+			$('#detailForm input[name=stockApplRate]').val(100);
+		} else {
+			$('#detailForm input[name=stockApplRate]').val('');
+		}
+	});
+	
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+
+	// 신규버튼
+	$('#btnNew').on('click', function() {
+		$("#detailForm")[0].reset();
+		$('#detailForm input[name=delvLocCd]').attr('readonly', false);
+		$('#detailForm input[name=delvLocCd]').focus();
+	});
+	
+	// 저장
+	$("#btnSave").on("click", function() {
+		// 필수값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
+					$('#btnNew').trigger('click');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('출고처 목록', gridOptions);
+	});
+	
+	/**
+	 * DAUM을 이용한 우편번호 팝업 레이어
+	 * @param callbackPosition - 우편번호 정보를 설정할 위치
+	 */
+	var fnOpenDaumAddr = function(callbackPosition) {
+		let daumZip = new daum.Postcode({
+			oncomplete: function(data) {
+				// 우편번호와 주소 정보를 해당 필드에 넣는다.
+				if (callbackPosition == 'delvLoc') {
+					$('#detailForm input[name=delvLocZipcode]').val(data.zonecode);
+					$('#detailForm input[name=delvLocBaseAddr]').val(cfnGetDaumRoadAddr(data));
+					$('#detailForm input[name=delvLocDtlAddr]').focus();
+				} else if (callbackPosition == 'rtnLoc') {
+					$('#detailForm input[name=rtnLocZipcode]').val(data.zonecode);
+					$('#detailForm input[name=rtnLocBaseAddr]').val(cfnGetDaumRoadAddr(data));
+					$('#detailForm input[name=rtnLocDtlAddr]').focus();
+				}
+				
+				cfnCloseDaumAddr();
+			},
+			width: '100%'
+		});
+		
+		cfnOpenDaumAddr(daumZip);
+	}
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 205 - 205
style24.admin/src/main/webapp/WEB-INF/views/business/SellStoreForm.html

@@ -1,205 +1,205 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : SellStoreForm.html
- * @desc    : 판매매장관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.20   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/sellstore/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:30%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>판매매장</th>
-						<td>
-							<input type="text" class="w200" name="sellStoreNm" placeholder="판매매장명" required="required" data-valid-name="판매매장"/>
-						</td>
-						<th>사용여부</th>
-						<td>
-							<select name="useYn">
-								<option value="Y">Yes</option>
-								<option value="N">No</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="left">
-					<button type="button" class="btn btn-warning btn-lg" id="btnAddRow">행추가</button>
-					<button type="button" class="btn btn-danger btn-lg" id="btnDeleteRow">행삭제</button>
-				</li>
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
-			
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-		</div>
-		<!-- //리스트 영역 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
-	let useYnList = { "Y":"Yes", "N":"No" };
-
-	let columnDefs = [
-		{
-			headerName: "공급업체", field: "supplyCompCd", width: 150, cellClass: 'text-center',
-			cellEditor: 'agRichSelectCellEditor',
-			cellEditorParams: { values: gagaAgGrid.extractValues(supplyCompList) },
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(supplyCompList, params.value); },
-			valueParser: function (params) { return gagaAgGrid.lookupKey(supplyCompList, params.newValue); }
-		},
-		{
-			headerName: "판매매장코드", field: "sellStoreCd", width: 150, cellClass: 'text-center',
-			cellEditor: 'textCellEditor',
-			cellEditorParams: { maxlength: 20, required: true }
-		},
-		{
-			headerName: "판매매장명", field: "sellStoreNm", width: 300, cellClass: 'text-center',
-			cellEditor: 'textCellEditor',
-			cellEditorParams: { maxlength: 50, required: true }
-		},
-		{
-			headerName: "사용여부", field: "useYn", width: 150, cellClass: 'text-center',
-			cellEditor: 'agRichSelectCellEditor',
-			cellEditorParams: { values: gagaAgGrid.extractValues(useYnList) },
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.value); },
-			valueParser: function (params) { return gagaAgGrid.lookupKey(useYnList, params.newValue); }
-		}
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// Grid editable
-	gridOptions.defaultColDef.editable = true;
-	
-	// 검색
-	$('#btnSearch').on('click', function() {
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-
-	// 행추가
-	$('#btnAddRow').on('click', function() {
-		var data = { supplyCompCd: null, sellStoreCd: null, sellStoreNm: null, useYn: "Y" };
-		gagaAgGrid.addRowData(gridOptions, data, "sellStoreCd");
-	});
-	
-	// 행삭제
-	$('#btnDeleteRow').on('click', function() {
-		var removedData = gagaAgGrid.removeRowData(gridOptions);
-		
-		if (removedData.length == 0) {
-			mcxDialog.alert('선택된 행이 없습니다.');
-			return;
-		}
-		
-		mcxDialog.confirm("삭제하시겠습니까?", {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값을 변환
-				var updatedData = [];
-				
-				$.each(removedData, function(idx, item) {
-					item.useYn = 'N';
-					updatedData.push(item);
-				});
-				
-				
-				var jsonData = JSON.stringify(updatedData);
-				gagajf.ajaxJsonSubmit('/business/sellstore/list/save', jsonData, function() {
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	// 저장
-	$("#btnSave").on("click", function() {
-		var changeData = gagaAgGrid.getChangedData(gridOptions);
-
-		if (changeData.length < 1) {
-			mcxDialog.alert('변경된 데이터가 없습니다.');
-			return;
-		}
-
-		// Validation
-		if (!gagaAgGrid.validation(gridOptions, changeData))
-			return;
-
-		mcxDialog.confirm('저장하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				var jsonData = JSON.stringify(changeData);
-				gagajf.ajaxJsonSubmit('/business/sellstore/list/save', jsonData, function() {
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('판매매장 목록', gridOptions);
-	});
-	
-	$(document).ready(function() {
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SellStoreForm.html
+ * @desc    : 판매매장관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.20   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/sellstore/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:30%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>판매매장</th>
+						<td>
+							<input type="text" class="w200" name="sellStoreNm" placeholder="판매매장명" required="required" data-valid-name="판매매장"/>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="Y">Yes</option>
+								<option value="N">No</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="left">
+					<button type="button" class="btn btn-warning btn-lg" id="btnAddRow">행추가</button>
+					<button type="button" class="btn btn-danger btn-lg" id="btnDeleteRow">행삭제</button>
+				</li>
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let supplyCompList = gagajf.convertToArray([[${supplyCompList}]]);
+	let useYnList = { "Y":"Yes", "N":"No" };
+
+	let columnDefs = [
+		{
+			headerName: "공급업체", field: "supplyCompCd", width: 150, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(supplyCompList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(supplyCompList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(supplyCompList, params.newValue); }
+		},
+		{
+			headerName: "판매매장코드", field: "sellStoreCd", width: 150, cellClass: 'text-center',
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 20, required: true }
+		},
+		{
+			headerName: "판매매장명", field: "sellStoreNm", width: 300, cellClass: 'text-center',
+			cellEditor: 'textCellEditor',
+			cellEditorParams: { maxlength: 50, required: true }
+		},
+		{
+			headerName: "사용여부", field: "useYn", width: 150, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(useYnList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(useYnList, params.newValue); }
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// Grid editable
+	gridOptions.defaultColDef.editable = true;
+	
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+
+	// 행추가
+	$('#btnAddRow').on('click', function() {
+		var data = { supplyCompCd: null, sellStoreCd: null, sellStoreNm: null, useYn: "Y" };
+		gagaAgGrid.addRowData(gridOptions, data, "sellStoreCd");
+	});
+	
+	// 행삭제
+	$('#btnDeleteRow').on('click', function() {
+		var removedData = gagaAgGrid.removeRowData(gridOptions);
+		
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm("삭제하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값을 변환
+				var updatedData = [];
+				
+				$.each(removedData, function(idx, item) {
+					item.useYn = 'N';
+					updatedData.push(item);
+				});
+				
+				
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/business/sellstore/list/save', jsonData, function() {
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 저장
+	$("#btnSave").on("click", function() {
+		var changeData = gagaAgGrid.getChangedData(gridOptions);
+
+		if (changeData.length < 1) {
+			mcxDialog.alert('변경된 데이터가 없습니다.');
+			return;
+		}
+
+		// Validation
+		if (!gagaAgGrid.validation(gridOptions, changeData))
+			return;
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify(changeData);
+				gagajf.ajaxJsonSubmit('/business/sellstore/list/save', jsonData, function() {
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('판매매장 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 172 - 172
style24.admin/src/main/webapp/WEB-INF/views/business/ShipCompanyForm.html

@@ -1,172 +1,172 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : ShipCompanyForm.html
- * @desc    : 배송업체관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.20   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/ship/company/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="left">
-					<button type="button" class="btn btn-warning btn-lg" id="btnAddRow">행추가</button>
-					<button type="button" class="btn btn-danger btn-lg" id="btnDeleteRow">행삭제</button>
-				</li>
-				<li class="right">
-					<button type="button" class="btn btn-info btn-lg" id="btnSave">저장</button>
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
-		</div>
-		<!-- //리스트 영역 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let useYnList = { "Y":"Yes", "N":"No" };
-
-	let columnDefs = [
-		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{
-			headerName: "배송업체코드", field: "shipCompCd", width: 100, cellClass: 'text-center',
-			editable: function(params) { return params.data.crud == 'C' ? true : false; },
-			cellEditorParams: { required: true },
-		},
-		{
-			headerName: "배송업체명", field: "shipCompNm", width: 150, cellClass: 'text-center',
-			editable: true,
-			cellEditorParams: { required: true },
-		},
-		{headerName: "배송추적URL", field: "trackingUrl", width: 800, editable: true},
-		{
-			headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center',
-			editable: true,
-			cellEditor: 'agRichSelectCellEditor',
-			cellEditorParams: { values: gagaAgGrid.extractValues(useYnList), required: true },
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.value); },
-			valueParser: function (params) { return gagaAgGrid.lookupKey(useYnList, params.newValue); }
-		}
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// 다중 선택
-	gridOptions.rowSelection = 'multiple';
-	
-	// 조회
-	$('#btnSearch').on('click', function() {
-		let actionUrl = $('#searchForm').prop('action') + '?' + $('#searchForm').serialize();
-		
-		// Fetch data
-		gagaAgGrid.fetch(actionUrl, gridOptions);
-	});
-
-	// 행추가
-	$('#btnAddRow').on('click', function() {
-		var data = { };
-		gagaAgGrid.addRowData(gridOptions, data, "shipCompCd");
-	});
-	
-	// 행삭제
-	$('#btnDeleteRow').on('click', function() {
-		var removedData = gagaAgGrid.removeRowData(gridOptions);
-		
-		if (removedData.length == 0) {
-			mcxDialog.alert('선택된 행이 없습니다.');
-			return;
-		}
-		
-		mcxDialog.confirm("삭제하시겠습니까?", {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값을 변환
-				var updatedData = [];
-				
-				$.each(removedData, function(idx, item) {
-					item.useYn = 'N';
-					updatedData.push(item);
-				});
-				
-				var jsonData = JSON.stringify(updatedData);
-				gagajf.ajaxJsonSubmit('/business/ship/company/list/delete', jsonData, function() {
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	// 저장
-	$("#btnSave").on("click", function() {
-		var changeData = gagaAgGrid.getChangedData(gridOptions);
-
-		if (changeData.length < 1) {
-			mcxDialog.alert('변경된 데이터가 없습니다.');
-			return;
-		}
-
-		// Validation
-		if (!gagaAgGrid.validation(gridOptions, changeData))
-			return;
-
-		mcxDialog.confirm('저장하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function(){
-				var jsonData = JSON.stringify(changeData);
-				gagajf.ajaxJsonSubmit('/business/ship/company/list/save', jsonData, function() {
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('배송업체 목록', gridOptions);
-	});
-	
-	$(document).ready(function() {
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ShipCompanyForm.html
+ * @desc    : 배송업체관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.20   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/ship/company/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="left">
+					<button type="button" class="btn btn-warning btn-lg" id="btnAddRow">행추가</button>
+					<button type="button" class="btn btn-danger btn-lg" id="btnDeleteRow">행삭제</button>
+				</li>
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnSave">저장</button>
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let useYnList = { "Y":"Yes", "N":"No" };
+
+	let columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{
+			headerName: "배송업체코드", field: "shipCompCd", width: 100, cellClass: 'text-center',
+			editable: function(params) { return params.data.crud == 'C' ? true : false; },
+			cellEditorParams: { required: true },
+		},
+		{
+			headerName: "배송업체명", field: "shipCompNm", width: 150, cellClass: 'text-center',
+			editable: true,
+			cellEditorParams: { required: true },
+		},
+		{headerName: "배송추적URL", field: "trackingUrl", width: 800, editable: true},
+		{
+			headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center',
+			editable: true,
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(useYnList), required: true },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(useYnList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(useYnList, params.newValue); }
+		}
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 다중 선택
+	gridOptions.rowSelection = 'multiple';
+	
+	// 조회
+	$('#btnSearch').on('click', function() {
+		let actionUrl = $('#searchForm').prop('action') + '?' + $('#searchForm').serialize();
+		
+		// Fetch data
+		gagaAgGrid.fetch(actionUrl, gridOptions);
+	});
+
+	// 행추가
+	$('#btnAddRow').on('click', function() {
+		var data = { };
+		gagaAgGrid.addRowData(gridOptions, data, "shipCompCd");
+	});
+	
+	// 행삭제
+	$('#btnDeleteRow').on('click', function() {
+		var removedData = gagaAgGrid.removeRowData(gridOptions);
+		
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm("삭제하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값을 변환
+				var updatedData = [];
+				
+				$.each(removedData, function(idx, item) {
+					item.useYn = 'N';
+					updatedData.push(item);
+				});
+				
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/business/ship/company/list/delete', jsonData, function() {
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 저장
+	$("#btnSave").on("click", function() {
+		var changeData = gagaAgGrid.getChangedData(gridOptions);
+
+		if (changeData.length < 1) {
+			mcxDialog.alert('변경된 데이터가 없습니다.');
+			return;
+		}
+
+		// Validation
+		if (!gagaAgGrid.validation(gridOptions, changeData))
+			return;
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var jsonData = JSON.stringify(changeData);
+				gagajf.ajaxJsonSubmit('/business/ship/company/list/save', jsonData, function() {
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('배송업체 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 492 - 492
style24.admin/src/main/webapp/WEB-INF/views/business/SupplyCompanyForm.html

@@ -1,492 +1,492 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : SupplyCompanyForm.html
- * @desc    : 공급업체관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.14   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/supply/company/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:30%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>검색어</th>
-						<td>
-							<select name="searchGb">
-								<option value="NAME">업체명</option>
-								<option value="OWNER">대표자명</option>
-							</select>
-							<input type="text" name="searchTxt" class="w300" maxlength="20"/>
-						</td>
-						<th>입점상태</th>
-						<td>
-							<select name="supplyStat">
-								<option value="">[전체]</option>
-								<option th:if="${supplyStatList}" th:each="oneData, status : ${supplyStatList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>전자계약여부</th>
-						<td>
-							<select name="econtractYn">
-								<option value="">[전체]</option>
-								<option value="Y">[Y] Yes</option>
-								<option value="N">[N] No</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
-		</div>
-		<!-- //리스트 영역 -->
-		
-		<!-- 등록/수정 -->
-		<div class="panelStyle">
-			<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/supply/company/save'}">
-				<table class="frmStyle" aria-describedby="등록/수정 폼">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-						<col style="width:10%;"/>
-						<col style="width:15%;"/>
-					</colgroup>
-					<tr>
-						<th>업체코드</th>
-						<td>
-							<input type="text" class="w150" name="supplyCompCd" placeholder="자동생성" maxlength="5" data-valid-name="업체코드" readonly="readonly"/>
-						</td>
-						<th>업체명<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="supplyCompNm" maxlength="100" required="required" data-valid-name="업체명"/>
-						</td>
-						<th>사업자구분<i class="required" title="필수"></i></th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="bizGb" value="C" checked="checked"/>법인<span></span></label>
-							<label class="rdoBtn"><input type="radio" name="bizGb" value="P"/>개인<span></span></label>
-						</td>
-						<th>사업자등록번호<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="bizNo" maxlength="20" required="required" data-valid-name="사업자등록번호"/>
-						</td>
-					</tr>
-					<tr>
-						<th>업종<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="bizKind" maxlength="100" required="required" data-valid-name="업종"/>
-						</td>
-						<th>업태<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="bizType" maxlength="100" required="required" data-valid-name="업태"/>
-						</td>
-						<th>입점상태<i class="required" title="필수"></i></th>
-						<td>
-							<select name="supplyStat" id="supplyStat" required="required" data-valid-name="입점상태">
-								<option value="">[선택]</option>
-								<option th:if="${supplyStatList}" th:each="oneData, status : ${supplyStatList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>대표자명<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="ownerNm" maxlength="50" required="required" data-valid-name="대표자명"/>
-						</td>
-					</tr>
-					<tr>
-						<th rowspan="2">사업장주소<i class="required" title="필수"></i></th>
-						<td colspan="3" rowspan="2">
-							<input type="text" name="bizZipcode"  class="w100" data-valid-name="우편번호" readonly="readonly"/>
-							&nbsp;&nbsp;&nbsp;
-							<button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr();">우편번호찾기</button>
-							<br>
-							<input type="text" name="bizBaseAddr" class="w300" maxlength="200" required="required" data-valid-name="사업장주소" readonly="readonly"/>
-							-
-							<input type="text" name="bizDtlAddr" class="w300" maxlength="200"/>
-						</td>
-						<th>홈페이지URL</th>
-						<td colspan="3">
-							<input type="text" name="homepageUrl" data-valid-name="홈페이지URL"/>
-						</td>
-					</tr>
-					<tr>
-						<th>대표전화<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="mainTelno" placeholder="02-0000-0000" maxlength="20" required="required" data-valid-name="대표전화"/>
-						</td>
-						<th>대표팩스번호</th>
-						<td>
-							<input type="text" name="mainFaxno" placeholder="02-0000-0000" maxlength="20" data-valid-name="대표팩스번호"/>
-						</td>
-					</tr>
-					<tr>
-						<th>유통구분<i class="required" title="필수"></i></th>
-						<td>
-							<select name="distributionGb" required="required" data-valid-name="유통구분">
-								<option value="">[선택]</option>
-								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>무료배송비최소주문금액<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="minOrdAmt" class="w100 aR" placeholder="30,000" maxlength="7" required="required" data-valid-type="integer" data-valid-name="무료배송비최소주문금액"/>원
-						</td>
-						<th>배송비<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="delvFee" class="w100 aR" placeholder="2,500" maxlength="7" required="required" data-valid-type="integer" data-valid-name="배송비"/>원
-						</td>
-						<th>판매수수료율<i class="required" title="필수"></i></th>
-						<td>
-							<input type="text" name="sellFeeRate" class="w100 aR" placeholder="0.0" maxlength="5" required="required" data-valid-type="real" data-valid-name="판매수수료율"/>%
-						</td>
-					</tr>
-					<tr>
-						<th>CS담당자</th>
-						<td>
-							<input type="text" name="csChargeNm" class="w100 aR" maxlength="50"/>
-						</td>
-						<th>CS담당자 연락처</th>
-						<td>
-							<input type="text" name="csChargeTelno" placeholder="02-0000-0000" maxlength="20"/>
-						</td>
-						<th>정산담당자</th>
-						<td>
-							<input type="text" name="settleChargeNm" class="w100 aR" maxlength="50"/>
-						</td>
-						<th>정산담당자 연락처</th>
-						<td>
-							<input type="text" name="settleChargeTelno" placeholder="02-0000-0000" maxlength="20"/>
-						</td>
-					</tr>
-					<tr>
-						<th>정산담당자 이메일</th>
-						<td>
-							<input type="text" name="settleChargeEmail" maxlength="100" data-valid-type="email"/>
-						</td>
-						<th>계산서 이메일</th>
-						<td>
-							<input type="text" name="billEmail" maxlength="100" data-valid-type="email"/>
-						</td>
-						<th>전자계약여부<i class="required" title="필수"></i></th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="econtractYn" value="Y" checked="checked"/>Yes<span></span></label>
-							<label class="rdoBtn"><input type="radio" name="econtractYn" value="N"/>No<span></span></label>
-						</td>
-						<th>정산주기<i class="required" title="필수"></i></th>
-						<td>
-							<select name="settleDay" required="required" data-valid-name="정산주기">
-								<option value="">[선택]</option>
-								<option th:if="${settleDayList}" th:each="oneData, status : ${settleDayList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-					</tr>
-					<tr>
-						<th>거래은행</th>
-						<td>
-							<select name="bankCd">
-								<option value="">[선택]</option>
-								<option th:if="${bankList}" th:each="oneData, status : ${bankList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>계좌번호</th>
-						<td>
-							<input type="text" name="accountNo" maxlength="20"/>
-						</td>
-						<th>예금주명</th>
-						<td>
-							<input type="text" name="depositorNm" maxlength="50"/>
-						</td>
-						<th>사용여부<i class="required" title="필수"></i></th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked"/>Yes<span></span></label>
-							<label class="rdoBtn"><input type="radio" name="useYn" value="N"/>No<span></span></label>
-						</td>
-					</tr>
-					<tr>
-						<th>총알배송여부<i class="required" title="필수"></i></th>
-						<td colspan="7">
-							<label class="rdoBtn"><input type="radio" name="shotDelvYn" value="Y"/>Yes<span></span></label>
-							<label class="rdoBtn"><input type="radio" name="shotDelvYn" value="N" checked="checked"/>No<span></span></label>
-						</td>
-					</tr>
-					<tr>
-						<th>비고</th>
-						<td colspan="7">
-							<textarea name="remarks" class="textareaR3"  data-valid-name="비고" ></textarea>
-						</td>
-					</tr>
-				</table>
-			</form>
-			
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
-					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-		</div>
-		<!-- 등록/수정 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	let supplyStatList = gagajf.convertToArray([[${supplyStatList}]]);
-	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
-	let bankList = gagajf.convertToArray([[${bankList}]]);
-
-	let columnDefs = [
-		{ headerName: "업체코드", field: "supplyCompCd", width: 100, cellClass: 'text-center' },
-		{
-			headerName: "업체명", field: "supplyCompNm", width: 150, cellClass: 'text-center',
-			cellRenderer: function(params) {
-				return '<a href="javascript:void(0);">' + params.value + '</a>';
-			}
-		},
-		{
-			headerName: "사업자구분", field: "bizGb", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) { return params.data.bizGb == 'C' ? '법인' : '개인'; }
-		},
-		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
-		{
-			headerName: "전자계약여부", field: "econtractYn", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) { return params.data.econtractYn == 'Y' ? 'Yes' : 'No'; }
-		},
-		{ headerName: "업종", field: "bizKind", width: 150, cellClass: 'text-center' },
-		{ headerName: "업태", field: "bizType", width: 150, cellClass: 'text-center' },
-		{
-			headerName: "총알배송여부", field: "shotDelvYn", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) { return params.data.shotDelvYn == 'Y' ? 'Yes' : 'No'; }
-		},
-		{
-			headerName: "입점상태", field: "supplyStat", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(supplyStatList, params.data.supplyStat);
-			}
-		},
-		{ headerName: "대표자명", field: "ownerNm", width: 100, cellClass: 'text-center' },
-		{ headerName: "우편번호", field: "bizZipcode", width: 80, cellClass: 'text-center' },
-		{ headerName: "기본주소", field: "bizBaseAddr", width: 250 },
-		{ headerName: "상세주소", field: "bizDtlAddr", width: 150 },
-		{ headerName: "대표전화번호", field: "mainTelno", width: 120, cellClass: 'text-center' },
-		{ headerName: "대표팩스번호", field: "mainFaxno", width: 120, cellClass: 'text-center' },
-		{ headerName: "홈페이지URL", field: "homepageUrl", width: 200 },
-		{
-			headerName: "유통구분", field: "distributionGb", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
-			}
-		},
-		{
-			headerName: "무료배송비최소주문금액", field: "minOrdAmt", width: 150, cellClass: 'text-center',
-			valueGetter: function(params) {
-				return Number(params.data.minOrdAmt).addComma();
-			}
-		},
-		{
-			headerName: "배송비", field: "delvFee", width: 100, cellClass: 'text-center',
-			valueGetter: function(params) {
-				return Number(params.data.delvFee).addComma();
-			}
-		},
-		{
-			headerName: "판매수수료율", field: "sellFeeRate", width: 120, cellClass: 'text-center',
-			valueGetter: function(params) {
-				return params.data.sellFeeRate + '%';
-			}
-		},
-		{ headerName: "CS담당자", field: "csChargeNm", width: 100, cellClass: 'text-center', hide: true },
-		{ headerName: "CS담당자연락처", field: "csChargeTelno", width: 100, cellClass: 'text-center', hide: true },
-		{ headerName: "정산담당자", field: "settleChargeNm", width: 100, cellClass: 'text-center', hide: true },
-		{ headerName: "정산담당자연락처", field: "settleChargeTelno", width: 100, cellClass: 'text-center', hide: true },
-		{ headerName: "정산담당자이메일", field: "settleChargeEmail", width: 100, cellClass: 'text-center', hide: true },
-		{ headerName: "계산서이메일", field: "billEmail", width: 100, cellClass: 'text-center', hide: true },
-		{ headerName: "정산주기", field: "settleDay", width: 100, cellClass: 'text-center', hide: true },
-		{
-			headerName: "은행명", field: "bankCd", width: 150, cellClass: 'text-center', hide: true,
-			valueGetter: function (params) {
-				return gagaAgGrid.lookupValue(bankList, params.data.bankCd);
-			}
-		},
-		{ headerName: "계좌번호", field: "accountNo", width: 150, cellClass: 'text-center', hide: true },
-		{ headerName: "예금주명", field: "depositorNm", width: 100, cellClass: 'text-center', hide: true },
-		{
-			headerName: "사용여부", field: "useYn", width: 100, cellClass: 'text-center',
-			valueGetter: function (params) { return params.data.useYn == 'Y' ? 'Yes' : 'No'; }
-		},
-		{ headerName: "비고", field: "remarks", width: 150, hide: true }
-	];
-
-	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// Cell click
-	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'supplyCompNm')
-			return;
-		
-		$('#detailForm input[name=supplyCompCd]').val(event.data.supplyCompCd);
-		$('#detailForm input[name=supplyCompNm]').val(event.data.supplyCompNm);
-		$('#detailForm select[name=supplyStat]').val(event.data.supplyStat);
-		$('#detailForm input[name=ownerNm]').val(event.data.ownerNm);
-		
-		if (event.data.bizGb == 'C') {
-			$('#detailForm input:radio[name=bizGb]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=bizGb]').eq(1).trigger('click');
-		}
-		
-		$('#detailForm input[name=bizNo] ').val(event.data.bizNo);
-		$('#detailForm input[name=bizKind]').val(event.data.bizKind);
-		$('#detailForm input[name=bizType]').val(event.data.bizType);
-		$('#detailForm input[name=bizZipcode]').val(event.data.bizZipcode);
-		$('#detailForm input[name=bizBaseAddr]').val(event.data.bizBaseAddr);
-		$('#detailForm input[name=bizDtlAddr]').val(event.data.bizDtlAddr);
-		$('#detailForm input[name=homepageUrl]').val(event.data.homepageUrl);
-		$('#detailForm select[name=distributionGb]').val(event.data.distributionGb);
-		$('#detailForm input[name=mainTelno]').val(event.data.mainTelno);
-		$('#detailForm input[name=mainFaxno]').val(event.data.mainFaxno);
-		$('#detailForm input[name=sellFeeRate]').val(event.data.sellFeeRate);
-		$('#detailForm input[name=csChargeNm]').val(event.data.csChargeNm);
-		$('#detailForm input[name=csChargeTelno]').val(event.data.csChargeTelno);
-		$('#detailForm input[name=settleChargeNm]').val(event.data.settleChargeNm);
-		$('#detailForm input[name=settleChargeTelno]').val(event.data.settleChargeTelno);
-		$('#detailForm input[name=settleChargeEmail]').val(event.data.settleChargeEmail);
-		$('#detailForm input[name=billEmail]').val(event.data.billEmail);
-		
-		if (event.data.econtractYn == 'Y') {
-			$('#detailForm input:radio[name=econtractYn]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=econtractYn]').eq(1).trigger('click');
-		}
-		
-		$('#detailForm input[name=settleDay]').val(event.data.settleDay);
-		$('#detailForm input[name=minOrdAmt]').val(Number(event.data.minOrdAmt).addComma());
-		$('#detailForm input[name=delvFee]').val(Number(event.data.delvFee).addComma());
-		$('#detailForm select[name=bankCd]').val(event.data.bankCd);
-		$('#detailForm input[name=accountNo]').val(event.data.accountNo);
-		$('#detailForm input[name=depositorNm]').val(event.data.depositorNm);
-		$('#detailForm textarea[name=remarks]').val(event.data.remarks);
-		
-		if (event.data.useYn == 'Y') {
-			$('#detailForm input:radio[name=useYn]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=useYn]').eq(1).trigger('click');
-		}
-		
-		if (event.data.shotDelvYn == 'Y') {
-			$('#detailForm input:radio[name=shotDelvYn]').eq(0).trigger('click');
-		} else {
-			$('#detailForm input:radio[name=shotDelvYn]').eq(1).trigger('click');
-		}
-	}
-
-	// 검색
-	$('#btnSearch').on('click', function() {
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-	
-	// 신규버튼
-	$('#btnNew').on('click', function() {
-		$("#detailForm")[0].reset();
-	});
-
-	// 저장
-	$("#btnSave").on("click", function() {
-		// 필수값 체크
-		if (!gagajf.validation('#detailForm'))
-			return false;
-
-		mcxDialog.confirm("저장하시겠습니까?", {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
-					$('#btnNew').trigger('click');
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('공급업체 목록', gridOptions);
-	});
-
-	/**
-	 * DAUM을 이용한 우편번호 팝업 레이어
-	 */
-	var fnOpenDaumAddr = function() {
-		let daumZip = new daum.Postcode({
-			oncomplete: function(data) {
-				// 우편번호와 주소 정보를 해당 필드에 넣는다.
-				$('#detailForm input[name=bizZipcode]').val(data.zonecode);
-				$('#detailForm input[name=bizBaseAddr]').val(cfnGetDaumRoadAddr(data));
-				$('#detailForm input[name=bizDtlAddr]').focus();
-				
-				cfnCloseDaumAddr();
-			},
-			width: '100%'
-		});
-		
-		cfnOpenDaumAddr(daumZip);
-	}
-	
-	$(document).ready(function() {
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SupplyCompanyForm.html
+ * @desc    : 공급업체관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.14   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/business/supply/company/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:30%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>검색어</th>
+						<td>
+							<select name="searchGb">
+								<option value="NAME">업체명</option>
+								<option value="OWNER">대표자명</option>
+							</select>
+							<input type="text" name="searchTxt" class="w300" maxlength="20"/>
+						</td>
+						<th>입점상태</th>
+						<td>
+							<select name="supplyStat">
+								<option value="">[전체]</option>
+								<option th:if="${supplyStatList}" th:each="oneData, status : ${supplyStatList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>전자계약여부</th>
+						<td>
+							<select name="econtractYn">
+								<option value="">[전체]</option>
+								<option value="Y">[Y] Yes</option>
+								<option value="N">[N] No</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		<!-- //리스트 영역 -->
+		
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" th:action="@{'/business/supply/company/save'}">
+				<table class="frmStyle" aria-describedby="등록/수정 폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+						<col style="width:10%;"/>
+						<col style="width:15%;"/>
+					</colgroup>
+					<tr>
+						<th>업체코드</th>
+						<td>
+							<input type="text" class="w150" name="supplyCompCd" placeholder="자동생성" maxlength="5" data-valid-name="업체코드" readonly="readonly"/>
+						</td>
+						<th>업체명<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="supplyCompNm" maxlength="100" required="required" data-valid-name="업체명"/>
+						</td>
+						<th>사업자구분<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="bizGb" value="C" checked="checked"/>법인<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="bizGb" value="P"/>개인<span></span></label>
+						</td>
+						<th>사업자등록번호<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="bizNo" maxlength="20" required="required" data-valid-name="사업자등록번호"/>
+						</td>
+					</tr>
+					<tr>
+						<th>업종<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="bizKind" maxlength="100" required="required" data-valid-name="업종"/>
+						</td>
+						<th>업태<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="bizType" maxlength="100" required="required" data-valid-name="업태"/>
+						</td>
+						<th>입점상태<i class="required" title="필수"></i></th>
+						<td>
+							<select name="supplyStat" id="supplyStat" required="required" data-valid-name="입점상태">
+								<option value="">[선택]</option>
+								<option th:if="${supplyStatList}" th:each="oneData, status : ${supplyStatList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>대표자명<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="ownerNm" maxlength="50" required="required" data-valid-name="대표자명"/>
+						</td>
+					</tr>
+					<tr>
+						<th rowspan="2">사업장주소<i class="required" title="필수"></i></th>
+						<td colspan="3" rowspan="2">
+							<input type="text" name="bizZipcode"  class="w100" data-valid-name="우편번호" readonly="readonly"/>
+							&nbsp;&nbsp;&nbsp;
+							<button type="button" class="btn btn-info btn-sm" onclick="fnOpenDaumAddr();">우편번호찾기</button>
+							<br>
+							<input type="text" name="bizBaseAddr" class="w300" maxlength="200" required="required" data-valid-name="사업장주소" readonly="readonly"/>
+							-
+							<input type="text" name="bizDtlAddr" class="w300" maxlength="200"/>
+						</td>
+						<th>홈페이지URL</th>
+						<td colspan="3">
+							<input type="text" name="homepageUrl" data-valid-name="홈페이지URL"/>
+						</td>
+					</tr>
+					<tr>
+						<th>대표전화<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="mainTelno" placeholder="02-0000-0000" maxlength="20" required="required" data-valid-name="대표전화"/>
+						</td>
+						<th>대표팩스번호</th>
+						<td>
+							<input type="text" name="mainFaxno" placeholder="02-0000-0000" maxlength="20" data-valid-name="대표팩스번호"/>
+						</td>
+					</tr>
+					<tr>
+						<th>유통구분<i class="required" title="필수"></i></th>
+						<td>
+							<select name="distributionGb" required="required" data-valid-name="유통구분">
+								<option value="">[선택]</option>
+								<option th:if="${distributionGbList}" th:each="oneData, status : ${distributionGbList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>무료배송비최소주문금액<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="minOrdAmt" class="w100 aR" placeholder="30,000" maxlength="7" required="required" data-valid-type="integer" data-valid-name="무료배송비최소주문금액"/>원
+						</td>
+						<th>배송비<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="delvFee" class="w100 aR" placeholder="2,500" maxlength="7" required="required" data-valid-type="integer" data-valid-name="배송비"/>원
+						</td>
+						<th>판매수수료율<i class="required" title="필수"></i></th>
+						<td>
+							<input type="text" name="sellFeeRate" class="w100 aR" placeholder="0.0" maxlength="5" required="required" data-valid-type="real" data-valid-name="판매수수료율"/>%
+						</td>
+					</tr>
+					<tr>
+						<th>CS담당자</th>
+						<td>
+							<input type="text" name="csChargeNm" class="w100 aR" maxlength="50"/>
+						</td>
+						<th>CS담당자 연락처</th>
+						<td>
+							<input type="text" name="csChargeTelno" placeholder="02-0000-0000" maxlength="20"/>
+						</td>
+						<th>정산담당자</th>
+						<td>
+							<input type="text" name="settleChargeNm" class="w100 aR" maxlength="50"/>
+						</td>
+						<th>정산담당자 연락처</th>
+						<td>
+							<input type="text" name="settleChargeTelno" placeholder="02-0000-0000" maxlength="20"/>
+						</td>
+					</tr>
+					<tr>
+						<th>정산담당자 이메일</th>
+						<td>
+							<input type="text" name="settleChargeEmail" maxlength="100" data-valid-type="email"/>
+						</td>
+						<th>계산서 이메일</th>
+						<td>
+							<input type="text" name="billEmail" maxlength="100" data-valid-type="email"/>
+						</td>
+						<th>전자계약여부<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="econtractYn" value="Y" checked="checked"/>Yes<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="econtractYn" value="N"/>No<span></span></label>
+						</td>
+						<th>정산주기<i class="required" title="필수"></i></th>
+						<td>
+							<select name="settleDay" required="required" data-valid-name="정산주기">
+								<option value="">[선택]</option>
+								<option th:if="${settleDayList}" th:each="oneData, status : ${settleDayList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>거래은행</th>
+						<td>
+							<select name="bankCd">
+								<option value="">[선택]</option>
+								<option th:if="${bankList}" th:each="oneData, status : ${bankList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>계좌번호</th>
+						<td>
+							<input type="text" name="accountNo" maxlength="20"/>
+						</td>
+						<th>예금주명</th>
+						<td>
+							<input type="text" name="depositorNm" maxlength="50"/>
+						</td>
+						<th>사용여부<i class="required" title="필수"></i></th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="Y" checked="checked"/>Yes<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="useYn" value="N"/>No<span></span></label>
+						</td>
+					</tr>
+					<tr>
+						<th>총알배송여부<i class="required" title="필수"></i></th>
+						<td colspan="7">
+							<label class="rdoBtn"><input type="radio" name="shotDelvYn" value="Y"/>Yes<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="shotDelvYn" value="N" checked="checked"/>No<span></span></label>
+						</td>
+					</tr>
+					<tr>
+						<th>비고</th>
+						<td colspan="7">
+							<textarea name="remarks" class="textareaR3"  data-valid-name="비고" ></textarea>
+						</td>
+					</tr>
+				</table>
+			</form>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let supplyStatList = gagajf.convertToArray([[${supplyStatList}]]);
+	let distributionGbList = gagajf.convertToArray([[${distributionGbList}]]);
+	let bankList = gagajf.convertToArray([[${bankList}]]);
+
+	let columnDefs = [
+		{ headerName: "업체코드", field: "supplyCompCd", width: 100, cellClass: 'text-center' },
+		{
+			headerName: "업체명", field: "supplyCompNm", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "사업자구분", field: "bizGb", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.bizGb == 'C' ? '법인' : '개인'; }
+		},
+		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
+		{
+			headerName: "전자계약여부", field: "econtractYn", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.econtractYn == 'Y' ? 'Yes' : 'No'; }
+		},
+		{ headerName: "업종", field: "bizKind", width: 150, cellClass: 'text-center' },
+		{ headerName: "업태", field: "bizType", width: 150, cellClass: 'text-center' },
+		{
+			headerName: "총알배송여부", field: "shotDelvYn", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.shotDelvYn == 'Y' ? 'Yes' : 'No'; }
+		},
+		{
+			headerName: "입점상태", field: "supplyStat", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(supplyStatList, params.data.supplyStat);
+			}
+		},
+		{ headerName: "대표자명", field: "ownerNm", width: 100, cellClass: 'text-center' },
+		{ headerName: "우편번호", field: "bizZipcode", width: 80, cellClass: 'text-center' },
+		{ headerName: "기본주소", field: "bizBaseAddr", width: 250 },
+		{ headerName: "상세주소", field: "bizDtlAddr", width: 150 },
+		{ headerName: "대표전화번호", field: "mainTelno", width: 120, cellClass: 'text-center' },
+		{ headerName: "대표팩스번호", field: "mainFaxno", width: 120, cellClass: 'text-center' },
+		{ headerName: "홈페이지URL", field: "homepageUrl", width: 200 },
+		{
+			headerName: "유통구분", field: "distributionGb", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(distributionGbList, params.data.distributionGb);
+			}
+		},
+		{
+			headerName: "무료배송비최소주문금액", field: "minOrdAmt", width: 150, cellClass: 'text-center',
+			valueGetter: function(params) {
+				return Number(params.data.minOrdAmt).addComma();
+			}
+		},
+		{
+			headerName: "배송비", field: "delvFee", width: 100, cellClass: 'text-center',
+			valueGetter: function(params) {
+				return Number(params.data.delvFee).addComma();
+			}
+		},
+		{
+			headerName: "판매수수료율", field: "sellFeeRate", width: 120, cellClass: 'text-center',
+			valueGetter: function(params) {
+				return params.data.sellFeeRate + '%';
+			}
+		},
+		{ headerName: "CS담당자", field: "csChargeNm", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "CS담당자연락처", field: "csChargeTelno", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "정산담당자", field: "settleChargeNm", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "정산담당자연락처", field: "settleChargeTelno", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "정산담당자이메일", field: "settleChargeEmail", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "계산서이메일", field: "billEmail", width: 100, cellClass: 'text-center', hide: true },
+		{ headerName: "정산주기", field: "settleDay", width: 100, cellClass: 'text-center', hide: true },
+		{
+			headerName: "은행명", field: "bankCd", width: 150, cellClass: 'text-center', hide: true,
+			valueGetter: function (params) {
+				return gagaAgGrid.lookupValue(bankList, params.data.bankCd);
+			}
+		},
+		{ headerName: "계좌번호", field: "accountNo", width: 150, cellClass: 'text-center', hide: true },
+		{ headerName: "예금주명", field: "depositorNm", width: 100, cellClass: 'text-center', hide: true },
+		{
+			headerName: "사용여부", field: "useYn", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.useYn == 'Y' ? 'Yes' : 'No'; }
+		},
+		{ headerName: "비고", field: "remarks", width: 150, hide: true }
+	];
+
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// Cell click
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'supplyCompNm')
+			return;
+		
+		$('#detailForm input[name=supplyCompCd]').val(event.data.supplyCompCd);
+		$('#detailForm input[name=supplyCompNm]').val(event.data.supplyCompNm);
+		$('#detailForm select[name=supplyStat]').val(event.data.supplyStat);
+		$('#detailForm input[name=ownerNm]').val(event.data.ownerNm);
+		
+		if (event.data.bizGb == 'C') {
+			$('#detailForm input:radio[name=bizGb]').eq(0).trigger('click');
+		} else {
+			$('#detailForm input:radio[name=bizGb]').eq(1).trigger('click');
+		}
+		
+		$('#detailForm input[name=bizNo] ').val(event.data.bizNo);
+		$('#detailForm input[name=bizKind]').val(event.data.bizKind);
+		$('#detailForm input[name=bizType]').val(event.data.bizType);
+		$('#detailForm input[name=bizZipcode]').val(event.data.bizZipcode);
+		$('#detailForm input[name=bizBaseAddr]').val(event.data.bizBaseAddr);
+		$('#detailForm input[name=bizDtlAddr]').val(event.data.bizDtlAddr);
+		$('#detailForm input[name=homepageUrl]').val(event.data.homepageUrl);
+		$('#detailForm select[name=distributionGb]').val(event.data.distributionGb);
+		$('#detailForm input[name=mainTelno]').val(event.data.mainTelno);
+		$('#detailForm input[name=mainFaxno]').val(event.data.mainFaxno);
+		$('#detailForm input[name=sellFeeRate]').val(event.data.sellFeeRate);
+		$('#detailForm input[name=csChargeNm]').val(event.data.csChargeNm);
+		$('#detailForm input[name=csChargeTelno]').val(event.data.csChargeTelno);
+		$('#detailForm input[name=settleChargeNm]').val(event.data.settleChargeNm);
+		$('#detailForm input[name=settleChargeTelno]').val(event.data.settleChargeTelno);
+		$('#detailForm input[name=settleChargeEmail]').val(event.data.settleChargeEmail);
+		$('#detailForm input[name=billEmail]').val(event.data.billEmail);
+		
+		if (event.data.econtractYn == 'Y') {
+			$('#detailForm input:radio[name=econtractYn]').eq(0).trigger('click');
+		} else {
+			$('#detailForm input:radio[name=econtractYn]').eq(1).trigger('click');
+		}
+		
+		$('#detailForm input[name=settleDay]').val(event.data.settleDay);
+		$('#detailForm input[name=minOrdAmt]').val(Number(event.data.minOrdAmt).addComma());
+		$('#detailForm input[name=delvFee]').val(Number(event.data.delvFee).addComma());
+		$('#detailForm select[name=bankCd]').val(event.data.bankCd);
+		$('#detailForm input[name=accountNo]').val(event.data.accountNo);
+		$('#detailForm input[name=depositorNm]').val(event.data.depositorNm);
+		$('#detailForm textarea[name=remarks]').val(event.data.remarks);
+		
+		if (event.data.useYn == 'Y') {
+			$('#detailForm input:radio[name=useYn]').eq(0).trigger('click');
+		} else {
+			$('#detailForm input:radio[name=useYn]').eq(1).trigger('click');
+		}
+		
+		if (event.data.shotDelvYn == 'Y') {
+			$('#detailForm input:radio[name=shotDelvYn]').eq(0).trigger('click');
+		} else {
+			$('#detailForm input:radio[name=shotDelvYn]').eq(1).trigger('click');
+		}
+	}
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 신규버튼
+	$('#btnNew').on('click', function() {
+		$("#detailForm")[0].reset();
+	});
+
+	// 저장
+	$("#btnSave").on("click", function() {
+		// 필수값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
+					$('#btnNew').trigger('click');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('공급업체 목록', gridOptions);
+	});
+
+	/**
+	 * DAUM을 이용한 우편번호 팝업 레이어
+	 */
+	var fnOpenDaumAddr = function() {
+		let daumZip = new daum.Postcode({
+			oncomplete: function(data) {
+				// 우편번호와 주소 정보를 해당 필드에 넣는다.
+				$('#detailForm input[name=bizZipcode]').val(data.zonecode);
+				$('#detailForm input[name=bizBaseAddr]').val(cfnGetDaumRoadAddr(data));
+				$('#detailForm input[name=bizDtlAddr]').focus();
+				
+				cfnCloseDaumAddr();
+			},
+			width: '100%'
+		});
+		
+		cfnOpenDaumAddr(daumZip);
+	}
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 254 - 254
style24.admin/src/main/webapp/WEB-INF/views/envset/AnswerPhaseForm.html

@@ -1,255 +1,255 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-	<!--
- *******************************************************************************
- * @source  : AnswerPhaseForm.html
- * @desc    : 답변문구관리 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.29   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<form id="searchForm" name="searchForm" action="#" th:action="@{'/envset/answer/phase/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
-				<table class="frmStyle" aria-describedby="검색조건">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>사이트</th>
-						<td>
-							<select name="siteCd">
-								<option value="">[전체]</option>
-								<option th:if="${siteList}" th:each="oneData, status : ${siteList}"th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>답변종류</th>
-						<td>
-							<select name="ansClsf">
-								<option value="">[전체]</option>
-								<option th:if="${ansClsfList}" th:each="oneData, status : ${ansClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>답변제목</th>
-						<td>
-							<input type="text" name="ansTitle" class="w200"/>
-						</td>
-						<th>사용여부</th>
-						<td>
-							<select name="useYn">
-								<option value="">[전체]</option>
-								<option value="Y">[Y] Yes</option>
-								<option value="N">[N] No</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-				
-				<ul class="panelBar">
-					<li class="center">
-						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
-						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
-					</li>
-				</ul>
-			</form>
-		</div>
-		<!-- 검색조건 영역 -->
-		
-		<!-- 리스트 영역 -->
-		<div class="panelStyle">
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-			
-			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
-		</div>
-		
-		<!-- 등록/수정 -->
-		<div class="panelStyle">
-			<form id="detailForm" name="detailForm" action="#" th:action="@{'/envset/answer/phase/save'}">
-				<input type="hidden" name="ansSq" value=""/>
-				<table class="frmStyle" aria-describedby="등록폼">
-					<colgroup>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col style="width:10%;"/>
-						<col style="width:20%;"/>
-						<col/>
-					</colgroup>
-					<tr>
-						<th>사이트<em class="required" title="필수"></em></th>
-						<td>
-							<select name="siteCd" required="required" data-valid-name="사이트">
-								<option>[전체]</option>
-								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>답변종류<em class="required" title="필수"></em></th>
-						<td>
-							<select name="ansClsf" required="required" data-valid-name="답변종류">
-								<option value="">[선택]</option>
-								<option th:if="${ansClsfList}" th:each="oneData, status : ${ansClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-						<th>사용여부</th>
-						<td>
-							<input type="hidden" name="useYn" value="Y"/>
-							<label class="chkBox"><input type="checkbox" name="chkUseYn" checked="checked"/>사용</label>
-						</td>
-					</tr>
-					<tr>
-						<th>답변제목<em class="required" title="필수"></em></th>
-						<td colspan="5">
-							<input type="text" name="ansTitle" required="required" data-valid-name="답변제목"/>
-						</td>
-						
-					</tr>
-					<tr>
-						<th>답변내용<em class="required" title="필수"></em></th>
-						<td colspan="5">
-							<textarea name="ansContent" class="textareaR3" required="required"  data-valid-name="답변내용"></textarea>
-						</td>
-					</tr>
-				</table>
-			</form>
-			
-			<!-- 버튼 배치 영역 -->
-			<ul class="panelBar">
-				<li class="right">
-					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
-					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
-				</li>
-			</ul>
-			<!-- //버튼 배치 영역 -->
-		</div>
-		<!-- 등록/수정 -->
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	var siteList = gagajf.convertToArray([[${siteList}]]);
-	var ansClsfList = gagajf.convertToArray([[${ansClsfList}]]);
-
-	var columnDefs = [
-		{headerName: "답변번호", field: "ansSq", width: 100, cellClass: 'text-center'},
-		{
-			headerName: "사이트", field: "siteCd", width: 150, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
-		},
-		{
-			headerName: "답변종류", field: "ansClsf", width: 150, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(ansClsfList, params.data.ansClsf); }
-		},
-		{
-			headerName: "답변제목", field: "ansTitle", width: 350,
-			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
-		},
-		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'},
-		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
-		{
-			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
-			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
-		},
-		{headerName: "수정자", field: "updNm", width: 100, cellClass: 'text-center'},
-		{
-			headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
-			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
-		}
-	];
-
-	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
-
-	// 셀 클릭 이벤트
-	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'ansTitle')
-			return;
-		
-		$('#detailForm input[name=ansSq]').val(event.data.ansSq); // 답변일련번호
-		$('#detailForm select[name=siteCd]').val(event.data.siteCd); // 사이트
-		$('#detailForm select[name=ansClsf]').val(event.data.ansClsf); // 답변종류
-
-		if (event.data.useYn == 'Y') {
-			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', true);
-		} else {
-			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', false);
-		}
-		
-		$('#detailForm input[name=ansTitle]').val(event.data.ansTitle.replaceAll('&gt;','>')); // 답변제목
-		$('#detailForm textarea[name=ansContent]').val(event.data.ansContent); // 답변내용
-	}
-
-	// 검색
-	$('#btnSearch').on('click', function() {
-		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
-	});
-	
-	// 신규
-	$('#btnNew').on('click', function() {
-		$('#detailForm')[0].reset();
-		$('#detailForm input[name=ansSq]').val('');
-		$('#detailForm input[name=ansTitle]').focus();
-	});
-
-	// 저장/수정
-	$("#btnSave").on("click", function() {
-		// 필수값 체크
-		if (!gagajf.validation('#detailForm'))
-			return false;
-
-		mcxDialog.confirm('저장하시겠습니까?', {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(':checked') ? 'Y' : 'N');
-				
-				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
-					$('btnNew').click();
-					$('#btnSearch').trigger('click');
-				});
-				
-				gagajf.ajaxJsonSubmit($(formId).prop("action"), jsonData, fnSaveCallback);
-			}
-		});
-	});
-
-	// 엑셀다운로드
-	$('#btnExcel').on('click', function() {
-		gagaAgGrid.exportToExcel('답변문구 목록', gridOptions);
-	});
-	
-	$(document).ready(function() {
-		gagaAgGrid.createGrid('gridList', gridOptions);
-	});
-/*]]>*/
-</script>
-
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+	<!--
+ *******************************************************************************
+ * @source  : AnswerPhaseForm.html
+ * @desc    : 답변문구관리 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.29   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/envset/answer/phase/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사이트</th>
+						<td>
+							<select name="siteCd">
+								<option value="">[전체]</option>
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}"th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>답변종류</th>
+						<td>
+							<select name="ansClsf">
+								<option value="">[전체]</option>
+								<option th:if="${ansClsfList}" th:each="oneData, status : ${ansClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>답변제목</th>
+						<td>
+							<input type="text" name="ansTitle" class="w200"/>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="">[전체]</option>
+								<option value="Y">[Y] Yes</option>
+								<option value="N">[N] No</option>
+							</select>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-base btn-lg" id="btnSearch">조회</button>
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+		
+		<!-- 리스트 영역 -->
+		<div class="panelStyle">
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-default btn-lg" id="btnExcel">엑셀다운로드</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+			
+			<div id="gridList" style="width: 100%; height: 470px" class="ag-theme-balham"></div>
+		</div>
+		
+		<!-- 등록/수정 -->
+		<div class="panelStyle">
+			<form id="detailForm" name="detailForm" action="#" th:action="@{'/envset/answer/phase/save'}">
+				<input type="hidden" name="ansSq" value=""/>
+				<table class="frmStyle" aria-describedby="등록폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사이트<em class="required" title="필수"></em></th>
+						<td>
+							<select name="siteCd" required="required" data-valid-name="사이트">
+								<option>[전체]</option>
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>답변종류<em class="required" title="필수"></em></th>
+						<td>
+							<select name="ansClsf" required="required" data-valid-name="답변종류">
+								<option value="">[선택]</option>
+								<option th:if="${ansClsfList}" th:each="oneData, status : ${ansClsfList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<input type="hidden" name="useYn" value="Y"/>
+							<label class="chkBox"><input type="checkbox" name="chkUseYn" checked="checked"/>사용</label>
+						</td>
+					</tr>
+					<tr>
+						<th>답변제목<em class="required" title="필수"></em></th>
+						<td colspan="5">
+							<input type="text" name="ansTitle" required="required" data-valid-name="답변제목"/>
+						</td>
+						
+					</tr>
+					<tr>
+						<th>답변내용<em class="required" title="필수"></em></th>
+						<td colspan="5">
+							<textarea name="ansContent" class="textareaR3" required="required"  data-valid-name="답변내용"></textarea>
+						</td>
+					</tr>
+				</table>
+			</form>
+			
+			<!-- 버튼 배치 영역 -->
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-info btn-lg" id="btnNew">신규</button>
+					<button type="button" class="btn btn-success btn-lg" id="btnSave">저장</button>
+				</li>
+			</ul>
+			<!-- //버튼 배치 영역 -->
+		</div>
+		<!-- 등록/수정 -->
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var siteList = gagajf.convertToArray([[${siteList}]]);
+	var ansClsfList = gagajf.convertToArray([[${ansClsfList}]]);
+
+	var columnDefs = [
+		{headerName: "답변번호", field: "ansSq", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "사이트", field: "siteCd", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
+		},
+		{
+			headerName: "답변종류", field: "ansClsf", width: 150, cellClass: 'text-center',
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(ansClsfList, params.data.ansClsf); }
+		},
+		{
+			headerName: "답변제목", field: "ansTitle", width: 350,
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "사용여부", field: "useYn", width: 80, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{headerName: "수정자", field: "updNm", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		}
+	];
+
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'ansTitle')
+			return;
+		
+		$('#detailForm input[name=ansSq]').val(event.data.ansSq); // 답변일련번호
+		$('#detailForm select[name=siteCd]').val(event.data.siteCd); // 사이트
+		$('#detailForm select[name=ansClsf]').val(event.data.ansClsf); // 답변종류
+
+		if (event.data.useYn == 'Y') {
+			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', true);
+		} else {
+			$("#detailForm input:checkbox[name=chkUseYn]").prop('checked', false);
+		}
+		
+		$('#detailForm input[name=ansTitle]').val(event.data.ansTitle.replaceAll('&gt;','>')); // 답변제목
+		$('#detailForm textarea[name=ansContent]').val(event.data.ansContent); // 답변내용
+	}
+
+	// 검색
+	$('#btnSearch').on('click', function() {
+		gagaAgGrid.fetch($('#searchForm').prop('action'), gridOptions, '#searchForm');
+	});
+	
+	// 신규
+	$('#btnNew').on('click', function() {
+		$('#detailForm')[0].reset();
+		$('#detailForm input[name=ansSq]').val('');
+		$('#detailForm input[name=ansTitle]').focus();
+	});
+
+	// 저장/수정
+	$("#btnSave").on("click", function() {
+		// 필수값 체크
+		if (!gagajf.validation('#detailForm'))
+			return false;
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$('#detailForm input[name=useYn]').val($('#detailForm input:checkbox[name=chkUseYn]').is(':checked') ? 'Y' : 'N');
+				
+				gagajf.ajaxFormSubmit($('#detailForm').prop('action'), '#detailForm', function() {
+					$('btnNew').click();
+					$('#btnSearch').trigger('click');
+				});
+				
+				gagajf.ajaxJsonSubmit($(formId).prop("action"), jsonData, fnSaveCallback);
+			}
+		});
+	});
+
+	// 엑셀다운로드
+	$('#btnExcel').on('click', function() {
+		gagaAgGrid.exportToExcel('답변문구 목록', gridOptions);
+	});
+	
+	$(document).ready(function() {
+		gagaAgGrid.createGrid('gridList', gridOptions);
+	});
+/*]]>*/
+</script>
+
 </html>

+ 379 - 379
style24.admin/src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html

@@ -1,379 +1,379 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : BasicEnvsetForm.html
- * @desc    : 기본환경설정 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.21   gagamel     최초 작성
- *******************************************************************************
- -->
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-		
-		<!-- 메뉴 설명 -->
-		<div class="infoBox menu-desc">
-		</div>
-		<!-- //메뉴 설명 -->
-		
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle">
-			<table class="frmStyle" aria-describedby="검색조건">
-				<colgroup>
-					<col style="width:10%;"/>
-					<col/>
-				</colgroup>
-				<tr>
-					<th>사이트</th>
-					<td>
-						<select name="siteCd" class="w150" onchange="fnSearch();">
-							<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-						</select>
-					</td>
-				</tr>
-			</table>
-		</div>
-		<!-- 검색조건 영역 -->
-
-		<div class="panelStyle">
-			<h4>[B10] 쇼핑몰Meta정보</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B10', '쇼핑몰Meta정보');">이력보기</button>
-			
-			<table class="frmStyle" aria-describedby="쇼핑몰Meta정보">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>웹브라우저Title</th>
-						<td>
-							<input name="b10StrSetVal1" type="text" class="w500" maxlength="200"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>웹 브라우저 상단에 노출되는 사이트 소개 문구입니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>쇼핑몰Title(og:title)</th>
-						<td>
-							<input name="b10StrSetVal2" type="text" class="w500" maxlength="200"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Title입니다. 영문/한글/숫자만 입력하세요.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>쇼핑몰설명(og:description)</th>
-						<td>
-							<input name="b10StrSetVal3" type="text" class="w500" maxlength="200"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Description입니다. 200자 이내의 영문/한글/숫자만 입력하세요.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>쇼핑몰이미지(og:image)</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b10StrSetVal4" name="b10StrSetVal4" class="uFileInput"/>
-								<label for="b10StrSetVal4" class="uFileLabel">쇼핑몰이미지 선택</label>
-								<input type="hidden" name="b10StrSetVal4OrgFileNm"/>
-								<input type="hidden" name="b10StrSetVal4SysFileNm"/>
-							</div>
-							<a id="b10StrSetVal4FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal4');"></a>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Image입니다</span>
-						</td>
-					</tr>
-					<tr>
-						<th>키워드(Keywords)</th>
-						<td>
-							<input name="b10StrSetVal5" type="text" class="w500" maxlength="70"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>70자 이내로 작성하시고 같은 단어는 3회 이상 반복하시면 안 됩니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>파비콘이미지</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b10StrSetVal6" name="b10StrSetVal6" class="uFileInput"/>
-								<label for="b10StrSetVal6" class="uFileLabel">파비콘이미지 선택</label>
-								<input type="hidden" name="b10StrSetVal6OrgFileNm"/>
-								<input type="hidden" name="b10StrSetVal6SysFileNm"/>
-							</div>
-							<a id="b10StrSetVal6FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal6');"></a>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>16x16 사이즈의 아이콘 이미지(확장자:ico)</span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-			
-			<h4>[B11] 기본설정</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B11');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B11', '기본설정');">이력보기</button>
-			<table class="frmStyle" aria-describedby="기본설정">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>탈퇴후재가입불가기간(일)</th>
-						<td><input name="b11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="탈퇴후재가입불가기간"/><span class="cRed">개월</span> 동안 탈퇴 후 재가입 불가합니다.</td>
-					</tr>
-					<tr>
-						<th>휴면회원선정기간(일)</th>
-						<td><input name="b11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원선정기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 선정합니다.</td>
-					</tr>
-					<tr>
-						<th>휴면회원전환기간(일)</th>
-						<td><input name="b11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원전환기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 전환합니다.</td>
-					</tr>
-					<tr>
-						<th>회원등급산정기간</th>
-						<td>직전월 이전 <input name="b11StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="회원등급산정기간"/><span class="cRed">개월</span> 기간동안의 매출금액을 기준으로 월초에 산정합니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 회원별등급산정을 하지 않습니다.</span></td>
-					</tr>
-					<tr>
-						<th>무료배송비최소주문금액</th>
-						<td>최소주문금액이 <input name="b11StrSetVal5" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="무료배송비최소주문금액"/> 원 이상이면 배송비가 무료입니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>이 값은 기본값이며 공급업체별로 다르게 설정할 수도 있습니다.</span></td>
-					</tr>
-				</tbody>
-			</table>
-			
-			<h4>[G10] 상품노출</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G10', '상품노출');">이력보기</button>
-			<table class="frmStyle" aria-describedby="상품노출">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>상품평노출여부</th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="Y" checked="checked"/>노출</label>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="N">미노출</label>
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>미노출로 설정 시 상품상세의 상품평 영역이 노출되지 않습니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>품절상품노출여부</th>
-						<td>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="Y"/>노출</label>
-							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="N" checked="checked">미노출</label>
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>품절된 상품을 사이트에 노출할지 말지를 설정합니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>특가세일노출기준</th>
-						<td>
-							상품 썸네일 리스트의 가격은 할인율이 <input name="g10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name=""/><span class="cRed">%</span> 이상일 경우 TAG가와 할인율 대신 <span class="infoTxt cBlue">'특가세일'</span>로 표기됩니다.
-						</td>
-					</tr>
-				</tbody>
-			</table>
-
-			<h4>[G11] 상품보관</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G11');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G11', '상품보관');">이력보기</button>
-			<table class="frmStyle" aria-describedby="상품보관">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>장바구니보관기간(일)</th>
-						<td>
-							장바구니 보관기간은 <input name="g11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>장바구니담기최대상품수</th>
-						<td>
-							장바구니에 담을 수 있는 최대 상품 개수는 <input name="g11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">개</span> 입니다.
-						</td>
-					</tr>
-					<tr>
-						<th>위시리스트보관기간(일)</th>
-						<td>
-							위시리스트 보관기간은 <input name="g11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="위시리스트보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-		</div>
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	// 조회
-	var fnSearch = function() {
-		var siteCd = $('select[name=siteCd]').val();
-		var actionUrl = '/envset/' + siteCd;
-
-		// 쇼핑몰Meta정보
-		$.getJSON(actionUrl + '/B10'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=b10StrSetVal1]').val(result.strSetVal1);
-							$('input[name=b10StrSetVal2]').val(result.strSetVal2);
-							$('input[name=b10StrSetVal3]').val(result.strSetVal3);
-							
-							if (!gagajf.isNull(result.strSetVal4)) {
-								$('input[name=b10StrSetVal4SysFileNm]').val(result.strSetVal4);
-								$('#b10StrSetVal4FileDownload').html(result.strSetVal4);
-								$('#b10StrSetVal4FileDownload').show();
-							}
-							
-							$('input[name=b10StrSetVal5]').val(result.strSetVal5);
-							
-							if (!gagajf.isNull(result.strSetVal6)) {
-								$('input[name=b10StrSetVal6SysFileNm]').val(result.strSetVal6);
-								$('#b10StrSetVal6FileDownload').html(result.strSetVal6);
-								$('#b10StrSetVal6FileDownload').show();
-							}
-						}
-					}
-				});
-
-		// 기본설정
-		$.getJSON(actionUrl + '/B11'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=b11StrSetVal1]').val(result.strSetVal1);
-							$('input[name=b11StrSetVal2]').val(result.strSetVal2);
-							$('input[name=b11StrSetVal3]').val(result.strSetVal3);
-							$('input[name=b11StrSetVal4]').val(result.strSetVal4);
-							$('input[name=b11StrSetVal5]').val(gagajf.isNull(result.strSetVal5) ? result.strSetVal5 : result.strSetVal5.addComma());
-						}
-					}
-				});
-		
-		// 상품노출
-		$.getJSON(actionUrl + '/G10'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$("input:radio[name=g10StrSetVal1]").parents('td').find('label').removeClass('checked');
-							if (result.strSetVal1 == 'Y') {
-								$("input:radio[name=g10StrSetVal1]").eq(0).prop('checked', true);
-							} else {
-								$("input:radio[name=g10StrSetVal1]").eq(1).prop('checked', true);
-							}
-
-							$("input:radio[name=g10StrSetVal2]").parents('td').find('label').removeClass('checked');
-							if (result.strSetVal2 == 'Y') {
-								$("input:radio[name=g10StrSetVal2]").eq(0).prop('checked', true);
-							} else {
-								$("input:radio[name=g10StrSetVal2]").eq(1).prop('checked', true);
-							}
-							
-							$('input[name=g10StrSetVal3]').val(result.strSetVal3);
-						}
-					}
-				});
-
-		// 상품보관
-		$.getJSON(actionUrl + '/G11'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=g11StrSetVal1]').val(result.strSetVal1);
-							$('input[name=g11StrSetVal2]').val(result.strSetVal2);
-							$('input[name=g11StrSetVal3]').val(result.strSetVal3);
-						}
-					}
-				});
-	}
-
-	// 파일첨부 선택 시
-	$('#b10StrSetVal4').on('change', function() { fnChooseFile(this); });
-	$('#b10StrSetVal6').on('change', function() { fnChooseFile(this); });
-
-	var fnChooseFile = function(obj) {
-		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
-		var file = obj.files[0];
-
-		// 파일 업로드
-		gagajf.ajaxFileUpload('/common/file/upload?subDir=/envset'
-				, file
-				, function(result) {
-					// 업로드한 파일명 설정
-					$('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
-					$('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
-				}
-		);
-	}
-
-	// 파일다운로드
-	var fnDownloadFile = function(id) {
-		$('#' + id + 'FileDownload').attr({
-			href : _uploadDefaultUrl + '/envset/' + $('input[name=' + id + 'SysFileNm]').val(),
-			target: '_blank'
-		}).get(0).click();
-	}
-
-	// 저장 처리
-	var fnSave = function(envsetType) {
-		var params = new Object();
-		params.siteCd = $('select[name=siteCd]').val();
-		params.envsetType = envsetType;
-
-		if (envsetType == 'B10') { // 쇼핑몰Meta정보
-			params.envsetNm = '쇼핑몰Meta정보';
-			params.strSetVal1 = $('input[name=b10StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=b10StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=b10StrSetVal3]').val();
-			params.strSetVal4 = $('input[name=b10StrSetVal4SysFileNm]').val();
-			params.strSetVal5 = $('input[name=b10StrSetVal5]').val();
-			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
-		} else if (envsetType == 'B11') { // 기본설정
-			params.envsetNm = '기본설정';
-			params.strSetVal1 = $('input[name=b11StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=b11StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=b11StrSetVal3]').val();
-			params.strSetVal4 = $('input[name=b11StrSetVal4]').val();
-			params.strSetVal5 = $('input[name=b11StrSetVal5]').val().removeComma();
-			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
-		} else if (envsetType == 'G10') { // 상품노출
-			params.envsetNm = '상품노출';
-			params.strSetVal1 = $('input:radio[name=g10StrSetVal1]:checked').val();
-			params.strSetVal2 = $('input:radio[name=g10StrSetVal2]:checked').val();
-			params.strSetVal3 = $('input[name=g10StrSetVal1]').val();
-		} else if (envsetType == 'G11') { // 상품보관
-			params.envsetNm = '상품보관';
-			params.strSetVal1 = $('input[name=g11StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=g11StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=g11StrSetVal3]').val();
-		}
-
-		var jsonData = JSON.stringify(params);
-		gagajf.ajaxJsonSubmit('/envset/create', jsonData);
-	}
-
-	// 환경설정 이력보기 팝업
-	var fnOpenEnvsetPopup = function(envsetType, envsetTypeNm) {
-		var actionUrl = '/envset/history/form'
-				+ '?siteCd=' + $('select[name=siteCd]').val()
-				+ '&envsetType=' + envsetType
-				+ '&envsetTypeNm=' + encodeURIComponent(envsetTypeNm);
-		cfnOpenModalPopup(actionUrl, 'popupEnvset');
-	}
-	
-	$(document).ready(function() {
-		$('select[name=siteCd]').trigger('change');
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : BasicEnvsetForm.html
+ * @desc    : 기본환경설정 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.21   gagamel     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<table class="frmStyle" aria-describedby="검색조건">
+				<colgroup>
+					<col style="width:10%;"/>
+					<col/>
+				</colgroup>
+				<tr>
+					<th>사이트</th>
+					<td>
+						<select name="siteCd" class="w150" onchange="fnSearch();">
+							<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+						</select>
+					</td>
+				</tr>
+			</table>
+		</div>
+		<!-- 검색조건 영역 -->
+
+		<div class="panelStyle">
+			<h4>[B10] 쇼핑몰Meta정보</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B10');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B10', '쇼핑몰Meta정보');">이력보기</button>
+			
+			<table class="frmStyle" aria-describedby="쇼핑몰Meta정보">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>웹브라우저Title</th>
+						<td>
+							<input name="b10StrSetVal1" type="text" class="w500" maxlength="200"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>웹 브라우저 상단에 노출되는 사이트 소개 문구입니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>쇼핑몰Title(og:title)</th>
+						<td>
+							<input name="b10StrSetVal2" type="text" class="w500" maxlength="200"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Title입니다. 영문/한글/숫자만 입력하세요.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>쇼핑몰설명(og:description)</th>
+						<td>
+							<input name="b10StrSetVal3" type="text" class="w500" maxlength="200"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Description입니다. 200자 이내의 영문/한글/숫자만 입력하세요.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>쇼핑몰이미지(og:image)</th>
+						<td>
+							<div class="uFile w500">
+								<input type="file" id="b10StrSetVal4" name="b10StrSetVal4" class="uFileInput"/>
+								<label for="b10StrSetVal4" class="uFileLabel">쇼핑몰이미지 선택</label>
+								<input type="hidden" name="b10StrSetVal4OrgFileNm"/>
+								<input type="hidden" name="b10StrSetVal4SysFileNm"/>
+							</div>
+							<a id="b10StrSetVal4FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal4');"></a>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Image입니다</span>
+						</td>
+					</tr>
+					<tr>
+						<th>키워드(Keywords)</th>
+						<td>
+							<input name="b10StrSetVal5" type="text" class="w500" maxlength="70"/>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>70자 이내로 작성하시고 같은 단어는 3회 이상 반복하시면 안 됩니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>파비콘이미지</th>
+						<td>
+							<div class="uFile w500">
+								<input type="file" id="b10StrSetVal6" name="b10StrSetVal6" class="uFileInput"/>
+								<label for="b10StrSetVal6" class="uFileLabel">파비콘이미지 선택</label>
+								<input type="hidden" name="b10StrSetVal6OrgFileNm"/>
+								<input type="hidden" name="b10StrSetVal6SysFileNm"/>
+							</div>
+							<a id="b10StrSetVal6FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal6');"></a>
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>16x16 사이즈의 아이콘 이미지(확장자:ico)</span>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+			
+			<h4>[B11] 기본설정</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B11');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B11', '기본설정');">이력보기</button>
+			<table class="frmStyle" aria-describedby="기본설정">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>탈퇴후재가입불가기간(일)</th>
+						<td><input name="b11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="탈퇴후재가입불가기간"/><span class="cRed">개월</span> 동안 탈퇴 후 재가입 불가합니다.</td>
+					</tr>
+					<tr>
+						<th>휴면회원선정기간(일)</th>
+						<td><input name="b11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원선정기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 선정합니다.</td>
+					</tr>
+					<tr>
+						<th>휴면회원전환기간(일)</th>
+						<td><input name="b11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원전환기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 전환합니다.</td>
+					</tr>
+					<tr>
+						<th>회원등급산정기간</th>
+						<td>직전월 이전 <input name="b11StrSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="회원등급산정기간"/><span class="cRed">개월</span> 기간동안의 매출금액을 기준으로 월초에 산정합니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 회원별등급산정을 하지 않습니다.</span></td>
+					</tr>
+					<tr>
+						<th>무료배송비최소주문금액</th>
+						<td>최소주문금액이 <input name="b11StrSetVal5" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="무료배송비최소주문금액"/> 원 이상이면 배송비가 무료입니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>이 값은 기본값이며 공급업체별로 다르게 설정할 수도 있습니다.</span></td>
+					</tr>
+				</tbody>
+			</table>
+			
+			<h4>[G10] 상품노출</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G10');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G10', '상품노출');">이력보기</button>
+			<table class="frmStyle" aria-describedby="상품노출">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col style="width: 85%;"/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>상품평노출여부</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="Y" checked="checked"/>노출</label>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="N">미노출</label>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>미노출로 설정 시 상품상세의 상품평 영역이 노출되지 않습니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>품절상품노출여부</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="Y"/>노출</label>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="N" checked="checked">미노출</label>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>품절된 상품을 사이트에 노출할지 말지를 설정합니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>특가세일노출기준</th>
+						<td>
+							상품 썸네일 리스트의 가격은 할인율이 <input name="g10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name=""/><span class="cRed">%</span> 이상일 경우 TAG가와 할인율 대신 <span class="infoTxt cBlue">'특가세일'</span>로 표기됩니다.
+						</td>
+					</tr>
+				</tbody>
+			</table>
+
+			<h4>[G11] 상품보관</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G11');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G11', '상품보관');">이력보기</button>
+			<table class="frmStyle" aria-describedby="상품보관">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col style="width: 85%;"/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>장바구니보관기간(일)</th>
+						<td>
+							장바구니 보관기간은 <input name="g11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>장바구니담기최대상품수</th>
+						<td>
+							장바구니에 담을 수 있는 최대 상품 개수는 <input name="g11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">개</span> 입니다.
+						</td>
+					</tr>
+					<tr>
+						<th>위시리스트보관기간(일)</th>
+						<td>
+							위시리스트 보관기간은 <input name="g11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="위시리스트보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+		</div>
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 조회
+	var fnSearch = function() {
+		var siteCd = $('select[name=siteCd]').val();
+		var actionUrl = '/envset/' + siteCd;
+
+		// 쇼핑몰Meta정보
+		$.getJSON(actionUrl + '/B10'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$('input[name=b10StrSetVal1]').val(result.strSetVal1);
+							$('input[name=b10StrSetVal2]').val(result.strSetVal2);
+							$('input[name=b10StrSetVal3]').val(result.strSetVal3);
+							
+							if (!gagajf.isNull(result.strSetVal4)) {
+								$('input[name=b10StrSetVal4SysFileNm]').val(result.strSetVal4);
+								$('#b10StrSetVal4FileDownload').html(result.strSetVal4);
+								$('#b10StrSetVal4FileDownload').show();
+							}
+							
+							$('input[name=b10StrSetVal5]').val(result.strSetVal5);
+							
+							if (!gagajf.isNull(result.strSetVal6)) {
+								$('input[name=b10StrSetVal6SysFileNm]').val(result.strSetVal6);
+								$('#b10StrSetVal6FileDownload').html(result.strSetVal6);
+								$('#b10StrSetVal6FileDownload').show();
+							}
+						}
+					}
+				});
+
+		// 기본설정
+		$.getJSON(actionUrl + '/B11'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$('input[name=b11StrSetVal1]').val(result.strSetVal1);
+							$('input[name=b11StrSetVal2]').val(result.strSetVal2);
+							$('input[name=b11StrSetVal3]').val(result.strSetVal3);
+							$('input[name=b11StrSetVal4]').val(result.strSetVal4);
+							$('input[name=b11StrSetVal5]').val(gagajf.isNull(result.strSetVal5) ? result.strSetVal5 : result.strSetVal5.addComma());
+						}
+					}
+				});
+		
+		// 상품노출
+		$.getJSON(actionUrl + '/G10'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$("input:radio[name=g10StrSetVal1]").parents('td').find('label').removeClass('checked');
+							if (result.strSetVal1 == 'Y') {
+								$("input:radio[name=g10StrSetVal1]").eq(0).prop('checked', true);
+							} else {
+								$("input:radio[name=g10StrSetVal1]").eq(1).prop('checked', true);
+							}
+
+							$("input:radio[name=g10StrSetVal2]").parents('td').find('label').removeClass('checked');
+							if (result.strSetVal2 == 'Y') {
+								$("input:radio[name=g10StrSetVal2]").eq(0).prop('checked', true);
+							} else {
+								$("input:radio[name=g10StrSetVal2]").eq(1).prop('checked', true);
+							}
+							
+							$('input[name=g10StrSetVal3]').val(result.strSetVal3);
+						}
+					}
+				});
+
+		// 상품보관
+		$.getJSON(actionUrl + '/G11'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$('input[name=g11StrSetVal1]').val(result.strSetVal1);
+							$('input[name=g11StrSetVal2]').val(result.strSetVal2);
+							$('input[name=g11StrSetVal3]').val(result.strSetVal3);
+						}
+					}
+				});
+	}
+
+	// 파일첨부 선택 시
+	$('#b10StrSetVal4').on('change', function() { fnChooseFile(this); });
+	$('#b10StrSetVal6').on('change', function() { fnChooseFile(this); });
+
+	var fnChooseFile = function(obj) {
+		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
+		var file = obj.files[0];
+
+		// 파일 업로드
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/envset'
+				, file
+				, function(result) {
+					// 업로드한 파일명 설정
+					$('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
+					$('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
+				}
+		);
+	}
+
+	// 파일다운로드
+	var fnDownloadFile = function(id) {
+		$('#' + id + 'FileDownload').attr({
+			href : _uploadDefaultUrl + '/envset/' + $('input[name=' + id + 'SysFileNm]').val(),
+			target: '_blank'
+		}).get(0).click();
+	}
+
+	// 저장 처리
+	var fnSave = function(envsetType) {
+		var params = new Object();
+		params.siteCd = $('select[name=siteCd]').val();
+		params.envsetType = envsetType;
+
+		if (envsetType == 'B10') { // 쇼핑몰Meta정보
+			params.envsetNm = '쇼핑몰Meta정보';
+			params.strSetVal1 = $('input[name=b10StrSetVal1]').val();
+			params.strSetVal2 = $('input[name=b10StrSetVal2]').val();
+			params.strSetVal3 = $('input[name=b10StrSetVal3]').val();
+			params.strSetVal4 = $('input[name=b10StrSetVal4SysFileNm]').val();
+			params.strSetVal5 = $('input[name=b10StrSetVal5]').val();
+			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
+		} else if (envsetType == 'B11') { // 기본설정
+			params.envsetNm = '기본설정';
+			params.strSetVal1 = $('input[name=b11StrSetVal1]').val();
+			params.strSetVal2 = $('input[name=b11StrSetVal2]').val();
+			params.strSetVal3 = $('input[name=b11StrSetVal3]').val();
+			params.strSetVal4 = $('input[name=b11StrSetVal4]').val();
+			params.strSetVal5 = $('input[name=b11StrSetVal5]').val().removeComma();
+			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
+		} else if (envsetType == 'G10') { // 상품노출
+			params.envsetNm = '상품노출';
+			params.strSetVal1 = $('input:radio[name=g10StrSetVal1]:checked').val();
+			params.strSetVal2 = $('input:radio[name=g10StrSetVal2]:checked').val();
+			params.strSetVal3 = $('input[name=g10StrSetVal1]').val();
+		} else if (envsetType == 'G11') { // 상품보관
+			params.envsetNm = '상품보관';
+			params.strSetVal1 = $('input[name=g11StrSetVal1]').val();
+			params.strSetVal2 = $('input[name=g11StrSetVal2]').val();
+			params.strSetVal3 = $('input[name=g11StrSetVal3]').val();
+		}
+
+		var jsonData = JSON.stringify(params);
+		gagajf.ajaxJsonSubmit('/envset/create', jsonData);
+	}
+
+	// 환경설정 이력보기 팝업
+	var fnOpenEnvsetPopup = function(envsetType, envsetTypeNm) {
+		var actionUrl = '/envset/history/form'
+				+ '?siteCd=' + $('select[name=siteCd]').val()
+				+ '&envsetType=' + envsetType
+				+ '&envsetTypeNm=' + encodeURIComponent(envsetTypeNm);
+		cfnOpenModalPopup(actionUrl, 'popupEnvset');
+	}
+	
+	$(document).ready(function() {
+		$('select[name=siteCd]').trigger('change');
+	});
+/*]]>*/
+</script>
+
+</html>

+ 192 - 192
style24.admin/src/main/webapp/WEB-INF/views/envset/ClauseDetailForm.html

@@ -1,192 +1,192 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : ClauseDetailForm.html
- * @desc    : 약관 상세 팝업 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.29   gagamel     최초 작성
- *******************************************************************************
- -->
-<div class="modalPopup" data-width="900" id="popupClause">
-	<div class="panelStyle">
-		<!-- TITLE -->
-		<div class="panelTitle">
-			<strong th:text="${'약관 ' + (mode == 'N' ? '등록' : '상세')}">약관 상세</strong>
-			<button type="button" class="close" onclick="uifnPopupClose('popupClause');"><em class="fa fa-times"></em></button>
-		</div>
-		<!-- //TITLE -->
-		
-		<!-- CONTENT -->
-		<div class="panelContent" th:if="${mode == 'N'}">
-			<form id="clauseDetailForm" name="clauseDetailForm" action="#" th:action="@{'/envset/clause/save'}" th:method="post">
-				<input type="hidden" name="mode" th:value="${mode}"/>
-				
-				<table class="frmStyle" aria-describedby="등록폼">
-					<colgroup>
-						<col style="width:15%;"/>
-						<col style="width:25%;"/>
-						<col style="width:15%;"/>
-						<col style="width:45%;"/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<th>약관번호</th>
-							<td>
-								<input type="text" name="clauseSq" maxlength="20" placeholder="자동생성" readonly="readonly"/>
-							</td>
-							<th>사이트<em class="required" title="필수"></em></th>
-							<td>
-								<select name="siteCd" required="required">
-									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
-								</select>
-							</td>
-						</tr>
-						<tr>
-							<th>약관유형<em class="required" title="필수"></em></th>
-							<td>
-								<select name="clauseType" required="required">
-									<option th:if="${clauseTypeList}" th:each="oneData, status : ${clauseTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
-								</select>
-							</td>
-							<th>시행일자<em class="required" title="필수"></em></th>
-							<td>
-								<input type="text" class="schDate w80" name="effectDt" maxlength="10" required="required" data-valid-type="calendar" data-valid-name="시행일자"/>
-							</td>
-						</tr>
-						<tr>
-							<th>노출여부</th>
-							<td colspan="3">
-								<input type="hidden" name="dispYn" value="Y"/>
-								<label class="chkBox"><input type="checkbox" name="chkDispYn" value="Y" checked="checked"/>노출</label>
-								<span class="cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i> 노출여부를 체크할 경우, 현재 약관으로 노출됩니다.</span>
-							</td>
-						</tr>
-						<tr>
-							<th>약관 제목<em class="required" title="필수"></em></th>
-							<td colspan="3">
-								<input type="text" name="clauseTitle" placeholder="" maxlength="100" data-valid-name="약관 제목"/>
-							</td>
-						</tr>
-						<tr>
-							<th>약관 내용<em class="required" title="필수"></em></th>
-							<td colspan="3">
-								<textarea class="textareaR4" id="clauseContent" name="clauseContent" data-valid-name="약관 내용"></textarea>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-			</form>
-		</div>
-		
-		<div class="panelContent" th:if="${mode == 'U'}">
-			<form id="clauseDetailForm" name="clauseDetailForm" action="#" th:action="@{'/envset/clause/save'}" th:method="post" th:object="${clauseInfo}">
-				<input type="hidden" name="mode" th:value="${mode}"/>
-				
-				<table class="frmStyle" aria-describedby="상세폼">
-					<colgroup>
-						<col style="width:15%;"/>
-						<col style="width:25%;"/>
-						<col style="width:15%;"/>
-						<col style="width:45%;"/>
-					</colgroup>
-					<tbody>
-						<tr>
-							<th>약관번호</th>
-							<td>
-								<input type="text" name="clauseSq" maxlength="20" placeholder="자동생성" readonly="readonly" th:field="*{clauseSq}"/>
-							</td>
-							<th>사이트<em class="required" title="필수"></em></th>
-							<td>
-								<select name="siteCd" required="required" th:field="*{siteCd}">
-									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|" th:selected="${siteCd == oneData.cd}"></option>
-								</select>
-							</td>
-						</tr>
-						<tr>
-							<th>약관유형<em class="required" title="필수"></em></th>
-							<td>
-								<select name="clauseType" required="required" th:field="*{clauseType}">
-									<option th:if="${clauseTypeList}" th:each="oneData, status : ${clauseTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|" th:selected="${clauseType == oneData.cd}"></option>
-								</select>
-							</td>
-							<th>시행일자<em class="required" title="필수"></em></th>
-							<td>
-								<input type="text" class="schDate w80" name="effectDt" maxlength="10" required="required" data-valid-type="calendar" data-valid-name="시행일자" th:field="*{effectDt}"/>
-							</td>
-						</tr>
-						<tr>
-							<th>노출여부</th>
-							<td colspan="3">
-								<input type="hidden" name="dispYn" value="Y" th:value="${clauseInfo.dispYn}"/>
-								<label class="chkBox"><input type="checkbox" name="chkDispYn" value="Y" th:checked="${clauseInfo.dispYn == 'Y'}"/>노출</label>
-								<span class="cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i> 노출여부를 체크할 경우, 현재 약관으로 노출됩니다.</span>
-							</td>
-						</tr>
-						<tr>
-							<th>약관 제목<em class="required" title="필수"></em></th>
-							<td colspan="3">
-								<input type="text" name="clauseTitle" placeholder="" maxlength="100" data-valid-name="약관 제목" th:field="*{clauseTitle}"/>
-							</td>
-						</tr>
-						<tr>
-							<th>약관 내용<em class="required" title="필수"></em></th>
-							<td colspan="3">
-								<textarea class="textareaR4" id="clauseContent" name="clauseContent" data-valid-name="약관 내용" th:field="*{clauseContent}"></textarea>
-							</td>
-						</tr>
-					</tbody>
-				</table>
-			</form>
-		</div>
-		<!-- //CONTENT -->
-
-		<!-- 버튼 배치 영역 -->
-		<ul class="panelBar">
-			<li class="right">
-				<button type="button" class="btn btn-info btn-lg" id="btnSaveClause">저장</button>
-			</li>
-		</ul>
-		<!-- //버튼 배치 영역 -->
-	</div>
-</div>
-
-<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020102902"></script>
-<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=20201030"></script>
-<script th:inline="javascript">
-/*<![CDATA[*/
-	// 저장
-	$('#btnSaveClause').on('click', function() {
-		// 입력 값 체크
-		if (!gagajf.validation('#clauseDetailForm'))
-			return false;
-		
-		mcxDialog.confirm("저장하시겠습니까?", {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function() {
-				$('#clauseDetailForm input[name=dispYn]').val($('#clauseDetailForm input:checkbox[name=chkDispYn]').is(':checked') ? 'Y' : 'N');
-				
-				gagajf.ajaxFormSubmit($('#clauseDetailForm').prop('action'), '#clauseDetailForm', function() {
-					uifnPopupClose('popupClause');
-					$('#btnSearch').trigger('click');
-				});
-			}
-		});
-	});
-	
-	$(document).ready(function() {
-		// Create a summernote
-		let snOptions = gagaSn.getToolbarOptions();
-		gagaSn.createSummernote(snOptions, '#clauseContent');
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : ClauseDetailForm.html
+ * @desc    : 약관 상세 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.29   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="900" id="popupClause">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong th:text="${'약관 ' + (mode == 'N' ? '등록' : '상세')}">약관 상세</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupClause');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent" th:if="${mode == 'N'}">
+			<form id="clauseDetailForm" name="clauseDetailForm" action="#" th:action="@{'/envset/clause/save'}" th:method="post">
+				<input type="hidden" name="mode" th:value="${mode}"/>
+				
+				<table class="frmStyle" aria-describedby="등록폼">
+					<colgroup>
+						<col style="width:15%;"/>
+						<col style="width:25%;"/>
+						<col style="width:15%;"/>
+						<col style="width:45%;"/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>약관번호</th>
+							<td>
+								<input type="text" name="clauseSq" maxlength="20" placeholder="자동생성" readonly="readonly"/>
+							</td>
+							<th>사이트<em class="required" title="필수"></em></th>
+							<td>
+								<select name="siteCd" required="required">
+									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th>약관유형<em class="required" title="필수"></em></th>
+							<td>
+								<select name="clauseType" required="required">
+									<option th:if="${clauseTypeList}" th:each="oneData, status : ${clauseTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+							<th>시행일자<em class="required" title="필수"></em></th>
+							<td>
+								<input type="text" class="schDate w80" name="effectDt" maxlength="10" required="required" data-valid-type="calendar" data-valid-name="시행일자"/>
+							</td>
+						</tr>
+						<tr>
+							<th>노출여부</th>
+							<td colspan="3">
+								<input type="hidden" name="dispYn" value="Y"/>
+								<label class="chkBox"><input type="checkbox" name="chkDispYn" value="Y" checked="checked"/>노출</label>
+								<span class="cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i> 노출여부를 체크할 경우, 현재 약관으로 노출됩니다.</span>
+							</td>
+						</tr>
+						<tr>
+							<th>약관 제목<em class="required" title="필수"></em></th>
+							<td colspan="3">
+								<input type="text" name="clauseTitle" placeholder="" maxlength="100" data-valid-name="약관 제목"/>
+							</td>
+						</tr>
+						<tr>
+							<th>약관 내용<em class="required" title="필수"></em></th>
+							<td colspan="3">
+								<textarea class="textareaR4" id="clauseContent" name="clauseContent" data-valid-name="약관 내용"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+		
+		<div class="panelContent" th:if="${mode == 'U'}">
+			<form id="clauseDetailForm" name="clauseDetailForm" action="#" th:action="@{'/envset/clause/save'}" th:method="post" th:object="${clauseInfo}">
+				<input type="hidden" name="mode" th:value="${mode}"/>
+				
+				<table class="frmStyle" aria-describedby="상세폼">
+					<colgroup>
+						<col style="width:15%;"/>
+						<col style="width:25%;"/>
+						<col style="width:15%;"/>
+						<col style="width:45%;"/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>약관번호</th>
+							<td>
+								<input type="text" name="clauseSq" maxlength="20" placeholder="자동생성" readonly="readonly" th:field="*{clauseSq}"/>
+							</td>
+							<th>사이트<em class="required" title="필수"></em></th>
+							<td>
+								<select name="siteCd" required="required" th:field="*{siteCd}">
+									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|" th:selected="${siteCd == oneData.cd}"></option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th>약관유형<em class="required" title="필수"></em></th>
+							<td>
+								<select name="clauseType" required="required" th:field="*{clauseType}">
+									<option th:if="${clauseTypeList}" th:each="oneData, status : ${clauseTypeList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|" th:selected="${clauseType == oneData.cd}"></option>
+								</select>
+							</td>
+							<th>시행일자<em class="required" title="필수"></em></th>
+							<td>
+								<input type="text" class="schDate w80" name="effectDt" maxlength="10" required="required" data-valid-type="calendar" data-valid-name="시행일자" th:field="*{effectDt}"/>
+							</td>
+						</tr>
+						<tr>
+							<th>노출여부</th>
+							<td colspan="3">
+								<input type="hidden" name="dispYn" value="Y" th:value="${clauseInfo.dispYn}"/>
+								<label class="chkBox"><input type="checkbox" name="chkDispYn" value="Y" th:checked="${clauseInfo.dispYn == 'Y'}"/>노출</label>
+								<span class="cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i> 노출여부를 체크할 경우, 현재 약관으로 노출됩니다.</span>
+							</td>
+						</tr>
+						<tr>
+							<th>약관 제목<em class="required" title="필수"></em></th>
+							<td colspan="3">
+								<input type="text" name="clauseTitle" placeholder="" maxlength="100" data-valid-name="약관 제목" th:field="*{clauseTitle}"/>
+							</td>
+						</tr>
+						<tr>
+							<th>약관 내용<em class="required" title="필수"></em></th>
+							<td colspan="3">
+								<textarea class="textareaR4" id="clauseContent" name="clauseContent" data-valid-name="약관 내용" th:field="*{clauseContent}"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+		<!-- //CONTENT -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnSaveClause">저장</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+	</div>
+</div>
+
+<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020102902"></script>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=20201030"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	// 저장
+	$('#btnSaveClause').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#clauseDetailForm'))
+			return false;
+		
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$('#clauseDetailForm input[name=dispYn]').val($('#clauseDetailForm input:checkbox[name=chkDispYn]').is(':checked') ? 'Y' : 'N');
+				
+				gagajf.ajaxFormSubmit($('#clauseDetailForm').prop('action'), '#clauseDetailForm', function() {
+					uifnPopupClose('popupClause');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	$(document).ready(function() {
+		// Create a summernote
+		let snOptions = gagaSn.getToolbarOptions();
+		gagaSn.createSummernote(snOptions, '#clauseContent');
+	});
+/*]]>*/
+</script>
+
+</html>

+ 234 - 234
style24.admin/src/main/webapp/WEB-INF/views/envset/EnvsetHistoryForm.html

@@ -1,234 +1,234 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : EnvsetHistoryForm.html
- * @desc    : 환경설정이력 팝업 Page
- *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.10.22   gagamel     최초 작성
- *******************************************************************************
- -->
-<div class="modalPopup" data-width="1200">
-	<div class="panelStyle">
-		<!-- TITLE -->
-		<div class="panelTitle">
-			<strong th:text="${envsetTypeNm + ' 이력'}">쇼핑몰Meat정보 이력</strong>
-			<button type="button" class="close" onclick="uifnPopupClose('popupEnvset');"><i class="fa fa-times" aria-hidden="true"></i></button>
-		</div>
-		<!-- //TITLE -->
-		
-		<!-- CONTENT -->
-		<div class="panelContent">
-			<div id="gridEnvsetHistoryList" style="width: 100%; height: 330px;" class="ag-theme-balham"></div>
-		</div>
-		<!-- //CONTENT -->
-	</div>
-</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	var envsetType = [[${envsetType}]];
-	var pointGiveType = { "A":"승인후지급", "D":"즉시지급" };
-	var pointUseType = { "A":"정액", "R":"정율" };
-
-	// 쇼핑몰Meta정보
-	var columnDefsB10 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "웹브라우저Title", field: "strSetVal1", width: 200},
-		{headerName: "쇼핑몰Title(og:title)", field: "strSetVal2", width: 200},
-		{headerName: "쇼핑몰설명(og:description)", field: "strSetVal3", width: 200},
-		{headerName: "쇼핑몰이미지(og:image)", field: "strSetVal4", width: 200},
-		{headerName: "키워드(Keywords)", field: "strSetVal5", width: 200},
-		{headerName: "파비콘이미지", field: "strSetVal6", width: 200},
-		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 기본설정
-	var columnDefsB11 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "탈퇴후재가입불가기간(월)", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "휴면회원선정기간(일)", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "휴면회원전환기간(일)", field: "strSetVal3", width: 150, cellClass: 'text-center'},
-		{headerName: "회원등급산정기간(월)", field: "strSetVal4", width: 150, cellClass: 'text-center'},
-		{headerName: "무료배송비최소주문금액", field: "strSetVal5", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value);}},
-		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-// 	// 회원혜택안내
-// 	var columnDefsB12 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "가입혜택안내배너(A)", field: "strSetVal1", width: 180},
-// 		{headerName: "가입혜택안내배너(B)", field: "strSetVal2", width: 180},
-// 		{headerName: "회원혜택안내배너", field: "strSetVal3", width: 180},
-// 		{headerName: "상품평혜택안내배너(상품상세)", field: "strSetVal4", width: 210},
-// 		{headerName: "상품평혜택안내배너(마이페이지)", field: "strSetVal5", width: 210},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-	// 상품노출
-	var columnDefsG10 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "상품평노출여부", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '노출' : '미노출'; }},
-		{headerName: "품절상품노출여부", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '노출' : '미노출'; }},
-		{headerName: "특가세일노출기준", field: "strSetVal3", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value + '%'; }},
-		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 상품보관
-	var columnDefsG11 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "장바구니보관기간", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function(params) { return params.value + '일'; }},
-		{headerName: "장바구니담기최대상품수", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function(params) { return params.value + '일'; }},
-		{headerName: "위시리스트보관기간", field: "strSetVal3", width: 150, cellClass: 'text-center', cellRenderer: function(params) { return params.value + '일'; }},
-		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-// 	// 품절안내
-// 	var columnDefsB14 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "품절안내방법", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'A' ? '발송' : '미발송'; }},
-// 		{headerName: "품절안내메시지발송기간", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-// 	// 배송/구매확정
-// 	var columnDefsB15 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "배송완료처리기간", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "구매확정처리기간", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-// 	// 회원쿠폰
-// 	var columnDefsC10 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "가입축하쿠폰", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "앱푸쉬수신동의쿠폰", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-// 		{headerName: "생일축하쿠폰", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-// 		{headerName: "생일쿠폰발급도래시점", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-// 	// 회원포인트
-// 	var columnDefsP10 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "가입축하기본포인트", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "가입축하추가포인트", field: "strSetVal6", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "생일축하포인트", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "앱설치후최초로그인포인트", field: "strSetVal3", width: 200, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "출석체크1일포인트", field: "strSetVal4", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-// 	// 구매포인트
-// 	var columnDefsP11 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "자사상품정상포인트(PC)", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "자사상품정상포인트(모바일)", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-// 		{headerName: "자사상품이월포인트(PC)", field: "strSetVal3", width: 150, cellClass: 'text-center'},
-// 		{headerName: "자사상품이월포인트(모바일)", field: "strSetVal4", width: 150, cellClass: 'text-center'},
-// 		{headerName: "입점상품정상포인트(PC)", field: "strSetVal5", width: 150, cellClass: 'text-center'},
-// 		{headerName: "입점상품정상포인트(모바일)", field: "strSetVal6", width: 150, cellClass: 'text-center'},
-// 		{headerName: "입점상품이월포인트(PC)", field: "strSetVal7", width: 150, cellClass: 'text-center'},
-// 		{headerName: "입점상품이월포인트(모바일)", field: "strSetVal8", width: 150, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-// 	// 상품평포인트
-// 	var columnDefsP12 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "포인트지급방법", field: "strSetVal1", width: 150, cellClass: 'text-center',
-// 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(pointGiveType, params.value); }
-// 		},
-// 		{headerName: "텍스트상품평포인트", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "포토상품평포인트", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-// 		{headerName: "최초텍스트상품평배율", field: "strSetVal3", width: 150, cellClass: 'text-center'},
-// 		{headerName: "최초포토상품평포인트배율", field: "strSetVal4", width: 150, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-// 	// 클레임포인트
-// 	var columnDefsP13 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "배송지연보상기준일수", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "배송지연보상포인트", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-// 		{headerName: "품절보상기준일수", field: "strSetVal3", width: 150, cellClass: 'text-center'},
-// 		{headerName: "품절보상포인트", field: "strSetVal4", width: 150, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-// 	// 가용포인트전환
-// 	var columnDefsP20 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "가용포인트전환대기일수", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-// 		{headerName: "가용포인트추가적립율", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-// 	// 포인트사용
-// 	var columnDefsP30 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "사용방법", field: "strSetVal1", width: 80, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(pointUseType, params.value); }},
-// 		{
-// 			headerName: "사용단위", field: "strSetVal2", width: 100, cellClass: 'text-center',
-// 			cellRenderer: function (params) {
-// 				var value = '';
-// 				if (params.value == '10') { value = '일원'; }
-// 				else if (params.value == '100') { value = '십원'; }
-// 				else if (params.value == '1000') { value = '백원'; }
-// 				return value + '단위절사';
-// 			}
-// 		},
-// 		{headerName: "사용가능보유포인트금액", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "사용가능최소포인트금액", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "사용가능최대포인트율", field: "strSetVal3", width: 150, cellClass: 'text-center'},
-// 		{headerName: "즉시사용최대포인트금액", field: "strSetVal5", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "최소주문제한금액", field: "strSetVal4", width: 120, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-// 	// 모바일앱
-// 	var columnDefsM10 = [
-// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-// 		{headerName: "AOS버전", field: "strSetVal1", width: 100, cellClass: 'text-center'},
-// 		{headerName: "IOS버전", field: "strSetVal2", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
-// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-// 	];
-
-	// Get GridOptions
-	var gridOptions = gagaAgGrid.getGridOptions(eval('columnDefs' + envsetType));
-
-	$(document).ready(function() {
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridEnvsetHistoryList', gridOptions);
-
-		var actionUrl = '/envset/history/' + [[${siteCd}]] + '/' + envsetType;
-
-		// Fetch data
-		gagaAgGrid.fetch(actionUrl, gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : EnvsetHistoryForm.html
+ * @desc    : 환경설정이력 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.22   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong th:text="${envsetTypeNm + ' 이력'}">쇼핑몰Meat정보 이력</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupEnvset');"><i class="fa fa-times" aria-hidden="true"></i></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<div id="gridEnvsetHistoryList" style="width: 100%; height: 330px;" class="ag-theme-balham"></div>
+		</div>
+		<!-- //CONTENT -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var envsetType = [[${envsetType}]];
+	var pointGiveType = { "A":"승인후지급", "D":"즉시지급" };
+	var pointUseType = { "A":"정액", "R":"정율" };
+
+	// 쇼핑몰Meta정보
+	var columnDefsB10 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "웹브라우저Title", field: "strSetVal1", width: 200},
+		{headerName: "쇼핑몰Title(og:title)", field: "strSetVal2", width: 200},
+		{headerName: "쇼핑몰설명(og:description)", field: "strSetVal3", width: 200},
+		{headerName: "쇼핑몰이미지(og:image)", field: "strSetVal4", width: 200},
+		{headerName: "키워드(Keywords)", field: "strSetVal5", width: 200},
+		{headerName: "파비콘이미지", field: "strSetVal6", width: 200},
+		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
+
+	// 기본설정
+	var columnDefsB11 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "탈퇴후재가입불가기간(월)", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+		{headerName: "휴면회원선정기간(일)", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+		{headerName: "휴면회원전환기간(일)", field: "strSetVal3", width: 150, cellClass: 'text-center'},
+		{headerName: "회원등급산정기간(월)", field: "strSetVal4", width: 150, cellClass: 'text-center'},
+		{headerName: "무료배송비최소주문금액", field: "strSetVal5", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value);}},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
+
+// 	// 회원혜택안내
+// 	var columnDefsB12 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "가입혜택안내배너(A)", field: "strSetVal1", width: 180},
+// 		{headerName: "가입혜택안내배너(B)", field: "strSetVal2", width: 180},
+// 		{headerName: "회원혜택안내배너", field: "strSetVal3", width: 180},
+// 		{headerName: "상품평혜택안내배너(상품상세)", field: "strSetVal4", width: 210},
+// 		{headerName: "상품평혜택안내배너(마이페이지)", field: "strSetVal5", width: 210},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+	// 상품노출
+	var columnDefsG10 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "상품평노출여부", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '노출' : '미노출'; }},
+		{headerName: "품절상품노출여부", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '노출' : '미노출'; }},
+		{headerName: "특가세일노출기준", field: "strSetVal3", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value + '%'; }},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
+
+	// 상품보관
+	var columnDefsG11 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "장바구니보관기간", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function(params) { return params.value + '일'; }},
+		{headerName: "장바구니담기최대상품수", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function(params) { return params.value + '일'; }},
+		{headerName: "위시리스트보관기간", field: "strSetVal3", width: 150, cellClass: 'text-center', cellRenderer: function(params) { return params.value + '일'; }},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
+
+// 	// 품절안내
+// 	var columnDefsB14 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "품절안내방법", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'A' ? '발송' : '미발송'; }},
+// 		{headerName: "품절안내메시지발송기간", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 배송/구매확정
+// 	var columnDefsB15 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "배송완료처리기간", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "구매확정처리기간", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 회원쿠폰
+// 	var columnDefsC10 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "가입축하쿠폰", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "앱푸쉬수신동의쿠폰", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "생일축하쿠폰", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "생일쿠폰발급도래시점", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 회원포인트
+// 	var columnDefsP10 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "가입축하기본포인트", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "가입축하추가포인트", field: "strSetVal6", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "생일축하포인트", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "앱설치후최초로그인포인트", field: "strSetVal3", width: 200, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "출석체크1일포인트", field: "strSetVal4", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 구매포인트
+// 	var columnDefsP11 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "자사상품정상포인트(PC)", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "자사상품정상포인트(모바일)", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "자사상품이월포인트(PC)", field: "strSetVal3", width: 150, cellClass: 'text-center'},
+// 		{headerName: "자사상품이월포인트(모바일)", field: "strSetVal4", width: 150, cellClass: 'text-center'},
+// 		{headerName: "입점상품정상포인트(PC)", field: "strSetVal5", width: 150, cellClass: 'text-center'},
+// 		{headerName: "입점상품정상포인트(모바일)", field: "strSetVal6", width: 150, cellClass: 'text-center'},
+// 		{headerName: "입점상품이월포인트(PC)", field: "strSetVal7", width: 150, cellClass: 'text-center'},
+// 		{headerName: "입점상품이월포인트(모바일)", field: "strSetVal8", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 상품평포인트
+// 	var columnDefsP12 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "포인트지급방법", field: "strSetVal1", width: 150, cellClass: 'text-center',
+// 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(pointGiveType, params.value); }
+// 		},
+// 		{headerName: "텍스트상품평포인트", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "포토상품평포인트", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "최초텍스트상품평배율", field: "strSetVal3", width: 150, cellClass: 'text-center'},
+// 		{headerName: "최초포토상품평포인트배율", field: "strSetVal4", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 클레임포인트
+// 	var columnDefsP13 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "배송지연보상기준일수", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "배송지연보상포인트", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "품절보상기준일수", field: "strSetVal3", width: 150, cellClass: 'text-center'},
+// 		{headerName: "품절보상포인트", field: "strSetVal4", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 가용포인트전환
+// 	var columnDefsP20 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "가용포인트전환대기일수", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "가용포인트추가적립율", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 포인트사용
+// 	var columnDefsP30 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "사용방법", field: "strSetVal1", width: 80, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(pointUseType, params.value); }},
+// 		{
+// 			headerName: "사용단위", field: "strSetVal2", width: 100, cellClass: 'text-center',
+// 			cellRenderer: function (params) {
+// 				var value = '';
+// 				if (params.value == '10') { value = '일원'; }
+// 				else if (params.value == '100') { value = '십원'; }
+// 				else if (params.value == '1000') { value = '백원'; }
+// 				return value + '단위절사';
+// 			}
+// 		},
+// 		{headerName: "사용가능보유포인트금액", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "사용가능최소포인트금액", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "사용가능최대포인트율", field: "strSetVal3", width: 150, cellClass: 'text-center'},
+// 		{headerName: "즉시사용최대포인트금액", field: "strSetVal5", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "최소주문제한금액", field: "strSetVal4", width: 120, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 모바일앱
+// 	var columnDefsM10 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "AOS버전", field: "strSetVal1", width: 100, cellClass: 'text-center'},
+// 		{headerName: "IOS버전", field: "strSetVal2", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(eval('columnDefs' + envsetType));
+
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridEnvsetHistoryList', gridOptions);
+
+		var actionUrl = '/envset/history/' + [[${siteCd}]] + '/' + envsetType;
+
+		// Fetch data
+		gagaAgGrid.fetch(actionUrl, gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

Некоторые файлы не были показаны из-за большого количества измененных файлов